Очереди задач: RabbitMQ vs Redis Streams vs Yandex Message Queue
Три популярных способа разделить «принять запрос» и «сделать работу» в РФ-проектах 2026. Чем отличаются на практике, что выбрать под нагрузку и под команду.
Очередь сообщений нужна, как только в проекте появляется хотя бы одна асинхронная задача, которая не должна блокировать HTTP-запрос: отправка email, генерация документа, обращение к внешнему API, обработка загруженного файла. На бумаге выбор простой, на практике у трёх популярных решений разные сильные стороны и разная цена эксплуатации. Расскажу о трёх, которые мы используем чаще всего в РФ-проектах в 2026.
RabbitMQ — рабочая лошадка с богатыми возможностями
Классический брокер сообщений с поддержкой AMQP 0.9.1 и AMQP 1.0. Версия 4.x стабильна, есть штатный quorum-queue (репликация для отказоустойчивости), поддержка streams для журнальных нагрузок.
Когда выбираем:
- Нужны разные топологии маршрутизации: direct, topic, fanout, headers. Например, одно событие должно пойти в три разных воркера, но обработчиков может быть динамическое число
- Нужны гарантии доставки уровня enterprise: ack/nack, dead-letter exchange, retry с экспоненциальной задержкой
- Команда уже знает AMQP — это базовый стек для Symfony, Spring и Django-RQ-альтернатив
Что больно:
- Деплой кластера на самостоятельный хостинг — требует понимания Erlang и Mnesia. Большая часть production-инцидентов в RabbitMQ происходит при разделении кластера (split brain), и лечится это руками
- На небольших объёмах (до 100 сообщений в секунду) бывает overkill — настройка занимает дольше, чем сама бизнес-логика
- Метрики и наблюдаемость требуют отдельной настройки (prometheus_rabbitmq_exporter), из коробки только web UI
Стоимость: бесплатный сам по себе. Размещение на VPS — от 1000 руб/мес. Управляемый RabbitMQ есть у Yandex Cloud (managed) и Selectel, в среднем 5-15 тыс. руб/мес за рабочий кластер из трёх узлов.
Redis Streams — простота и скорость, если уже есть Redis
Не отдельный продукт, а возможность Redis 5+ (стабильная с 6.x). Это упорядоченный лог записей, из которого читают группы потребителей. На вид похоже на Kafka в миниатюре.
Когда выбираем:
- В проекте уже есть Redis для кеша/сессий, добавлять отдельную инфраструктуру не хочется
- Нужно ОЧЕНЬ быстро — Redis Streams выдают сотни тысяч сообщений в секунду на одном узле
- Логика обработки относительно простая: воркер берёт сообщение, делает работу, подтверждает
- Нужна возможность «прочитать историю» — Streams хранят сообщения, пока не превысят лимит размера
Что больно:
- Нет встроенной топологии маршрутизации — если нужно «отправить одно событие пяти разным группам», это всё равно делается, но руками через несколько Streams и fan-out на клиенте
- Гарантии доставки — at-least-once. Идемпотентность ложится на воркер
- В кластерной Redis Streams распределяются по slots, и при scale-out иногда переезжают между узлами — клиент должен это обрабатывать
- Persistence — это AOF/RDB Redis, что не то же самое, что брокер «по дизайну». Если Redis упадёт по памяти, могут быть потери
Стоимость: бесплатный. Self-hosted Redis на 4GB VPS — около 1500 руб/мес. Managed Redis в Yandex Cloud — от 4000 руб/мес за минимальную конфигурацию с репликой.
Yandex Message Queue — managed SQS-совместимый сервис
Управляемая очередь в Yandex Cloud, API почти полностью совместимое с Amazon SQS. Серверов в управлении ноль, платим за число сообщений и трафик.
Когда выбираем:
- Не хочется управлять инфраструктурой вообще — нужна «очередь как услуга»
- Объёмы переменные: тысяча сообщений в день половину месяца, миллион в день оставшиеся дни — платим только за то, что использовали
- Команда уже работает с SQS на других проектах — миграция вопрос смены endpoint
- Нужна интеграция с другими сервисами Yandex Cloud: Functions, Triggers, Object Storage
Что больно:
- Топология ровно одна — FIFO или стандартная очередь. Если нужна маршрутизация по типу сообщения, делайте несколько очередей
- Задержка выше, чем у self-hosted решений: 20-100ms на операцию против 1-5ms у локального Redis. Для большинства задач это не критично, но если очередь — это hot path — заметите
- FIFO-очереди имеют лимит 300 сообщений в секунду на группу
- Привязка к Yandex Cloud — переезд на другое облако потребует переписать клиентский код, хотя SQS-совместимость снижает боль
Стоимость: 0,40 руб за 1000 запросов после первых 100 тыс. в месяц бесплатно. Для проекта с миллионом сообщений в месяц — около 400 руб/мес плюс трафик. Серверов содержать не нужно.
Сравнительная таблица в одном абзаце
Если очень коротко: RabbitMQ — когда нужна гибкая маршрутизация и enterprise-фичи, готовы платить за обслуживание; Redis Streams — когда Redis уже есть и хочется высокую скорость с минимальной инфраструктурой; Yandex MQ — когда не хочется управлять серверами и устраивает простая модель очереди.
Что выбрать под типичные сценарии
- Отправка email/SMS из веб-приложения — Yandex MQ или Redis Streams. Объёмы небольшие, требований к маршрутизации нет
- Обработка изображений после загрузки — Redis Streams (если уже есть Redis) или Yandex MQ + Yandex Functions для serverless обработки
- Событийная архитектура с несколькими микросервисами — RabbitMQ с topic exchange. Это его профильная задача
- Большие потоки данных (миллионы событий в день, аналитика) — ни одно из трёх. Смотрите на Kafka, Yandex Data Streams или ClickHouse напрямую
- Распределённые задачи с приоритетами — RabbitMQ с priority queue, либо несколько очередей в любом из решений
Что мы делаем по умолчанию
На новых проектах с PHP/Symfony — RabbitMQ, потому что Symfony Messenger из коробки с ним работает, и обвязка минимальная. На проектах с Python/Django — обычно Redis Streams через библиотеку rq или celery с Redis backend. Если клиент уже в Yandex Cloud и не хочет управлять инфраструктурой — Yandex MQ. Никаких религиозных предпочтений, выбираем под конкретный стек.
Что не делайте
- Не запускайте брокер на той же машине, что и веб-сервер, даже на старте. При нагрузке они конкурируют за CPU и память
- Не пишите свои очереди на базе таблицы в БД — это работает только до первого пика, а потом блокировки разваливают всё
- Не игнорируйте идемпотентность воркеров. Любая очередь рано или поздно доставит сообщение дважды, и если воркер не готов — будет двойная запись
- Не разворачивайте кластер RabbitMQ, если в команде нет человека, который понимает Erlang. Возьмите managed
Выбор очереди — это в первую очередь выбор операционной модели: сколько вы готовы тратить на эксплуатацию против сколько готовы платить провайдеру. Технически все три решения справятся с типовой задачей.