Если вам нужна быстрая и простая шина сообщений на облачном VDS, NATS с модулем JetStream — один из самых практичных вариантов. Он сочетает низкие задержки и упрощённую модель темы/подписки с персистентностью, подтверждениями доставки и управлением ретенцией. В то же время у многих команд уже работает RabbitMQ — поэтому мы разберёмся, где NATS выигрывает, когда RabbitMQ логичнее оставить, и как аккуратно настроить JetStream с TLS на продакшн-сервере.
Кратко: NATS, JetStream и где здесь RabbitMQ
NATS — это высокопроизводительная шина сообщений с минималистичным протоколом и фокусом на горизонтальном масштабировании и низких задержках. JetStream — модуль персистентности и потоков поверх NATS, добавляющий хранение, подтверждения, повторные доставки, ретенцию и дедупликацию. RabbitMQ — зрелый брокер с богатой экосистемой, маршрутизацией через обменники/биндинги, плагинами и привычной моделью очередей.
Выбирают NATS/JetStream, когда важны:
- минимальная задержка публикации/доставки;
- простая модель подписок по темам (subjects) с подстановками;
- лёгкая эксплуатация и небольшой потребляемый объём ресурсов на VDS;
- унификация: ephemeral-подписки, персистентные стримы, лёгкий путь от pub/sub до durable work-queue.
RabbitMQ остаётся сильным вариантом, если нужно:
- сложная маршрутизация через разные типы обменников;
- богатая экосистема плагинов и UI;
- устоявшиеся процессы вокруг AMQP и готовые адаптеры.
Ключевое отличие в модели: у NATS основной примитив — subject, у JetStream — stream/consumer поверх subject; у RabbitMQ — очередь, связаная через exchange с routing key. Перенос паттернов потребует переосмысления, но обычно даёт выигрыш по простоте.
Архитектура JetStream: термины и гарантии
В JetStream вы создаёте stream — логическое хранилище сообщений по набору subjects (например, events.*). Внутри stream настраиваются retention (по размеру, длительности и количеству сообщений) и storage (память или диск). Потребители — это consumers с политикой подтверждений, лимитами и типом доставки.
- Ack-политики:
explicit(ручные подтверждения),none,all(подтверждение пачки). - Доставка: push (сервер отправляет сообщения подписчику) или pull (клиент сам запрашивает батч сообщений).
- Retain/Retain+Durable: durable-консюмеры сохраняют позицию и переживают перезапуски.
- Retentions:
limits(по квотам),interest(хранить пока есть интерес),workqueue(семантика очереди работ).
Гарантии доставки чаще всего «at-least-once» с возможной повторной доставкой. «Exactly-once» обычно достигается идемпотентностью приложения и дедупликацией по ключу.

Планирование ресурсов на VDS
JetStream может использовать память и/или файловое хранилище. Для большинства рабочих нагрузок на VDS оптимален file storage на SSD, с выделением под JetStream отдельного каталога и мониторингом свободного места.
- CPU: 2–4 vCPU для 10–50 тысяч сообщений/сек при небольших размерах сообщений; больше — при интенсивном шифровании TLS и сложных подписках.
- RAM: 2–8 ГБ; JetStream буферизует и хранит индексы, плюс overhead клиентов.
- Диск: SSD, неблокирующие IOPS; планируйте исходя из пикового потока и ретенции. Важна задержка fsync.
- FS и тюнинг: отдельный раздел под
/var/lib/nats/jetstream, включите регулярный мониторинг I/O и места. - Сеть: 1 Гбит/с достаточно для большинства задач; следите за RTT и потерями.
Системные лимиты для интенсивных нагрузок:
# больше файловых дескрипторов
ulimit -n 1048576
# sysctl (применяйте осознанно)
sysctl -w net.core.somaxconn=1024
sysctl -w net.ipv4.ip_local_port_range="10240 60999"
sysctl -w fs.inotify.max_user_watches=1048576
Установка и базовый запуск nats-server на Linux
Предполагаем, что бинарник nats-server уже установлен в /usr/local/bin. Создадим пользователя и каталоги, настроим systemd.
useradd --system --home /var/lib/nats --shell /usr/sbin/nologin nats
mkdir -p /etc/nats /var/lib/nats/jetstream /var/log/nats
chown -R nats:nats /var/lib/nats /var/log/nats
Пример конфигурации /etc/nats/nats-server.conf с включённым JetStream и без TLS (добавим TLS ниже):
port: 4222
server_name: nats-1
jetstream: {
store_dir: "/var/lib/nats/jetstream",
max_mem_store: 1Gb,
max_file_store: 50Gb
}
authorization: {
users: [
{ user: "app", password: "strong-secret", permissions: { publish: ["events.*"], subscribe: ["events.*"] } }
]
}
# HTTP-мониторинг (varz/connz/jsz)
http: 127.0.0.1:8222
time: {
# синхронизация времени критична для таймаутов и токенов
}
Юнит /etc/systemd/system/nats.service:
[Unit]
Description=NATS Server
After=network-online.target
Wants=network-online.target
[Service]
User=nats
Group=nats
ExecStart=/usr/local/bin/nats-server -c /etc/nats/nats-server.conf
LimitNOFILE=1048576
Restart=on-failure
RestartSec=2s
WorkingDirectory=/var/lib/nats
[Install]
WantedBy=multi-user.target
Запуск и проверка:
systemctl daemon-reload
systemctl enable --now nats
systemctl status nats
TLS: шифрование и аутентификация
На продакшне включайте TLS для клиентских подключений и межкластерных соединений. Минимально — серверный сертификат и закрытый ключ; желательно с проверкой клиентских сертификатов (mTLS) или использованием nkeys/jwt. Если нужен публичный сертификат, используйте SSL-сертификаты.
Предположим, вы подготовили /etc/nats/certs/server.crt, server.key, а также ca.pem вашего центра сертификации. Включим TLS в конфиге:
port: 4222
server_name: nats-1
jetstream: {
store_dir: "/var/lib/nats/jetstream",
max_mem_store: 1Gb,
max_file_store: 50Gb
}
authorization: {
users: [
{ user: "app", password: "strong-secret", permissions: { publish: ["events.*"], subscribe: ["events.*"] } }
]
}
# HTTP-мониторинг лучше оставлять на localhost или за reverse-proxy с TLS
http: 127.0.0.1:8222
tls: {
cert_file: "/etc/nats/certs/server.crt",
key_file: "/etc/nats/certs/server.key",
ca_file: "/etc/nats/certs/ca.pem",
verify: true
}
С verify: true сервер будет проверять клиентские сертификаты, если клиенты их предъявляют. Если планируете строгую mTLS, выдавайте клиентские сертификаты от доверенного CA и включайте проверку на клиенте. Про детали цепочки доверия и управление собственным CA см. материал Как управлять собственным CA и цепочкой доверия для серверов.
Базовая проверка TLS после перезапуска:
systemctl restart nats
openssl s_client -connect 127.0.0.1:4222 -servername nats-1 -verify_return_error < /dev/null
nats CLI: работа со стримами и консюмерами
CLI сильно упрощает эксплуатацию JetStream. После установки утилиты nats проверьте подключение:
nats account info --server tls://127.0.0.1:4222 --tlsca /etc/nats/certs/ca.pem --user app --password strong-secret
Создадим stream для всех событий вашего приложения и зададим ретенцию:
nats stream add APP_EVENTS --subjects "events.*" --storage file --retention limits --max-msgs=-1 --max-bytes=20GB --max-age=168h --dupe-window=2m --ack --server tls://127.0.0.1:4222 --tlsca /etc/nats/certs/ca.pem --user app --password strong-secret
Добавим durable-консюмер с явными подтверждениями и ограничением параллелизма:
nats consumer add APP_EVENTS WORKER_A --deliver=all --ack explicit --filter "events.work" --max-pending=2048 --pull --backoff 1s,2s,5s,10s --server tls://127.0.0.1:4222 --tlsca /etc/nats/certs/ca.pem --user app --password strong-secret
Публикация и чтение:
# публикация
nats pub events.work "task-1" --server tls://127.0.0.1:4222 --tlsca /etc/nats/certs/ca.pem --user app --password strong-secret
# чтение батчами с ручным ack
nats consumer next APP_EVENTS WORKER_A --batch 50 --ack --server tls://127.0.0.1:4222 --tlsca /etc/nats/certs/ca.pem --user app --password strong-secret
Сопоставление паттернов: RabbitMQ → JetStream
Часто встречается перенос «очередь работ» из RabbitMQ. В JetStream этому соответствует stream с retention=workqueue и durable pull-консюмеры. Идемпотентность — обязательное требование, так как возможны повторные доставки.
- Fanout (broadcast): в RabbitMQ это fanout exchange; в NATS — публикация в subject, а у каждого сервиса свой consumer.
- Routing key: в RabbitMQ — ключ; в NATS — subject (с подстановками
*и>). - TTL и dead-letter: в RabbitMQ — политики очереди; в NATS — ретенция по времени и
max_deliverс маршрутами на отдельный DLQ-stream.
JetStream не стремится полностью повторить модель очередей AMQP. Вместо этого он даёт простые и быстрые строительные блоки. Отсюда и выгода — ниже накладные расходы и проще эксплуатация на VDS.
Надёжность: ack, redelivery, backpressure
Для «at-least-once» используйте ack=explicit и фиксируйте прогресс обработки после записи результата. Настройте max_deliver и backoff в консюмерах, чтобы не штормить при ошибках. Следите за max_ack_pending — он ограничивает число неподтверждённых сообщений.
Порядок сообщений не гарантирован глобально, но в рамках одного consumer со строго последовательной обработкой и небольшим параллелизмом порядок обычно сохраняется. Если порядок критичен, разделяйте потоки по ключу (sharding по subject или группам).
Мониторинг и алертинг
Стандартный HTTP-порт мониторинга предоставляет /varz, /connz, /routez, /jsz. Экспорт метрик в Prometheus поддерживается через эти endpoints. Ключевые метрики:
- latency публикации/потребления на стороне приложения;
- насыщение
max_ack_pending, ростnum_redelivered; - наполнение хранилища stream и общий доступный диск;
- ошибки TLS/аутентификации, количество соединений.
Логи nats-server компактны, но для расследования проблем включайте повышенный уровень для периода инцидента и собирайте их централизованно.

Сеть и безопасность на VDS
Откройте только нужные порты и ограничьте доступ по IP. По умолчанию: 4222/tcp — клиенты, 8222/tcp — мониторинг (держите на localhost или за reverse-proxy), 6222/tcp — кластер (если используется).
# Пример UFW: открыть клиентский TLS-порт только из приватной сети
ufw allow from 10.0.0.0/8 to any port 4222 proto tcp
ufw deny 8222/tcp
Используйте отдельного пользователя nats, жёсткие права на /etc/nats/certs, ротацию ключей и сертификатов. Для чувствительных систем рассмотрите клиентскую аутентификацию через nkeys/jwt.
Бэкапы и обслуживание JetStream
Для одиночного узла простой и безопасный способ — остановить сервис и сделать архив каталога JetStream:
systemctl stop nats
cd /var/lib/nats
tar -czf /root/jetstream-backup.tgz jetstream
systemctl start nats
Для минимизации даунтайма в продакшне используйте снапшоты на уровне блочного устройства или включайте кластер и снапшоты через API. Важно: проверяйте восстановление на стенде и убедитесь, что версии сервера совпадают.
Производительность: nats bench и размер сообщения
Встроенный бенчмарк позволяет оценить пропускную способность. Начинайте с небольшого размера сообщений (например, 256–1024 байт) и постепенно увеличивайте, отслеживая latency и CPU. Включённый TLS увеличит нагрузку на CPU — заложите запас по vCPU на VDS.
# пример синтетического теста публикации
nats bench foo --pub 4 --sub 4 --msgs 100000 --size 512 --server tls://127.0.0.1:4222 --tlsca /etc/nats/certs/ca.pem --user app --password strong-secret
Типичные ошибки и диагностика
- «Шторм» редоставок: проверьте идемпотентность,
max_deliver,backoff, исключения приложения. - Заполнение диска: отрегулируйте
max_bytes,max_age, включите алерты 80/90% заполнения. - TLS handshake ошибки: проверьте цепочку CA, CN/SAN, совпадение имени хоста, время на сервере.
- Высокий RTT: проверьте маршрутизацию до VDS и лимиты на стороне фаервола/провайдера.
- Ограничения по дескрипторам: поднимите
LimitNOFILEи ulimit.
Кластер JetStream на будущее
Для высокой доступности используйте кластер из 3 узлов с отдельной сеткой для трафика кворума. Каждый поток настраивается с репликацией (например, R=3). Не смешивайте диски JetStream с другими тяжёлыми нагрузками, держите одинаковые версии сервера и строго следуйте процедурам обновления.
Чеклист запуска на VDS
- План мощности: CPU/RAM/SSD с запасом.
- Отдельный каталог и мониторинг диска.
- TLS на клиентских соединениях, приватный мониторинг.
- Стримы с ограничениями по возрасту/объёму, DLQ-потоки.
- Durable-консюмеры с явным ack и backoff.
- Алерты на редоставки, задержки, место и ошибки TLS.
- Бэкап/restore-процедуры проверены на стенде.
Итоги
NATS с JetStream на VDS — это быстрый и компактный фундамент для обмена событиями и очередей работ. Он упрощает эксплуатацию, даёт гибкость в настройке ретенции и подтверждений и хорошо масштабируется. Если вам не нужны сложные маршруты AMQP и плагин-специфичные возможности, переход на JetStream даст выгодный баланс скорости, надёжности и простоты. Начните с одиночного узла с TLS, аккуратно перенесите ключевые паттерны из RabbitMQ, покройте метриками и алертами — и вы получите предсказуемую и быструю шину сообщений под вашу нагрузку.


