Какие задачи решает система с RabbitMQ
Что проверяют
Понимаете ли вы, зачем в системе брокер, а не обычный синхронный вызов, и какие проблемы очередь приносит взамен. Следом почти всегда спрашивают про гарантии доставки или про разницу с Kafka.
Как отвечать
Идите по задачам, а не по терминам:
- разгрузка запроса: пользователь получает ответ сразу, тяжёлое (письмо, PDF, пересчёт) уезжает в очередь;
- сглаживание пиков: очередь работает буфером, воркеры разбирают её в своём темпе, база не ложится под всплеск;
- масштабирование обработки: несколько потребителей на одну очередь,
basic.qosс prefetch, чтобы сообщения не улетали пачкой одному воркеру, пока другие простаивают; - маршрутизация и подписки: exchange типов
direct,topic,fanout,headers. Одно событие расходится по нескольким очередям, новый потребитель добавляется без правки издателя; - устойчивость: durable-очередь, persistent-сообщения, ручной
ackпосле обработки, publisher confirms на стороне издателя; - повторы и ошибки: dead letter exchange, отложенный повтор через TTL плюс DLX или плагин delayed message exchange.
Дальше про ограничения. At-least-once означает дубликаты, поэтому обработчик обязан быть идемпотентным: ключ идемпотентности, upsert, проверка уже применённого события. Порядок сохраняется только в очереди с одним потребителем, при нескольких воркерах он теряется. Надёжность в кластере дают quorum-очереди на raft, классического зеркалирования в RabbitMQ 4.x уже нет.
Закончите сравнением: RabbitMQ это брокер с богатой маршрутизацией и подтверждением каждого сообщения, Kafka это лог с ретеншеном и перечитыванием по офсету.
Где спотыкаются
Говорят, что очередь ускоряет систему. Она не ускоряет: суммарной работы столько же, просто часть уходит в фон, а сквозная задержка конкретной операции даже растёт.
Забывают про подтверждения. Автоматический ack теряет сообщение при падении воркера, а повторная доставка без идемпотентности отправляет письмо или списывает деньги дважды.
Не думают про переполнение. Без лимита длины, TTL и DLX очередь растёт, брокер упирается в memory watermark и включает flow control, после чего тормозят уже все издатели, а не только медленный потребитель.