Очереди сообщений и брокеры: Kafka и RabbitMQ

Брокер сообщений — это буфер между сервисами, который принимает, хранит и раздаёт задачи.

Брокер сообщений (message broker) — посредник, который принимает сообщения от отправителей (producers) и доставляет их получателям (consumers), развязывая их во времени и по скорости.

Зачем нужен брокер

  • Развязка. Producer не знает, кто и когда обработает сообщение; consumer'ов можно менять независимо.
  • Сглаживание пиков (buffering). Всплеск из 10 000 заказов кладётся в очередь, а обработчики разгребают её в своём темпе — база не захлёбывается.
  • Надёжность. Если обработчик упал, сообщения ждут в брокере, а не теряются.
  • Масштабирование. Медленный этап ускоряем, добавив больше consumer'ов на ту же очередь.
[ producer ] ──▶ [   БРОКЕР (очередь)   ] ──▶ [ consumer 1 ]
[ producer ] ──▶ [ msg msg msg msg ... ] ──▶ [ consumer 2 ]
                      буфер сглаживает пики    добавляем consumer'ов
                                               под рост нагрузки

Две модели: очередь и лог

Грубо брокеры делятся на два мира. Классическая очередь (RabbitMQ): сообщение доставлено одному получателю и удалено. Распределённый лог (Kafka): сообщения пишутся в упорядоченный лог и хранятся, любой consumer читает их в своём темпе, можно перечитать с начала.

RabbitMQ против Kafka

СвойствоRabbitMQKafka
Модельклассическая очередьраспределённый лог
После прочтениясообщение удаляетсяхранится (можно перечитать)
Маршрутизациягибкая (exchange, routing keys)простая, по топикам/партициям
Пропускная способностьвысокаяочень высокая (миллионы msg/с)
Сильная сторонасложная маршрутизация задачпотоки событий, аналитика, лог
Типичный кейсфоновые задачи, RPCevent streaming, метрики, ленты

Партиции и порядок (Kafka)

Топик в Kafka делится на партиции — это и есть его горизонтальное масштабирование. Порядок гарантируется только внутри партиции, не глобально. Сообщения с одним ключом (например, user_id) попадают в одну партицию, поэтому события одного пользователя обрабатываются по порядку. Это та же идея шардирования, что и в базах.

Что сказать на собеседовании

«Нужны фоновые задачи с гибкой маршрутизацией и подтверждениями — возьму RabbitMQ. Нужен поток событий с высокой пропускной способностью, хранением и возможностью перечитать (лента, аналитика, event sourcing) — возьму Kafka». Назвать почему важнее, чем назвать модную технологию.

Итог

  • Брокер развязывает сервисы, сглаживает пики и не теряет задачи при падении обработчика.
  • RabbitMQ — классическая очередь с гибкой маршрутизацией; Kafka — распределённый лог с хранением и огромной пропускной способностью.
  • В Kafka масштаб и порядок дают партиции; один ключ → одна партиция → порядок для этого ключа.
Проверьте себя
1. Как брокер сообщений помогает пережить всплеск нагрузки?
AОн отбрасывает лишние запросы
BБуферизует сообщения в очереди, а обработчики разгребают их в своём темпе, не перегружая базу
CОн ускоряет саму базу данных
DОн удваивает число серверов автоматически
2. Ключевое отличие Kafka от классической очереди RabbitMQ — это…
AKafka не умеет доставлять сообщения
BKafka — распределённый лог: сообщения хранятся и их можно перечитать, а не удаляются после доставки
CRabbitMQ быстрее Kafka на порядки
DKafka работает только синхронно
3. В Kafka порядок сообщений гарантируется…
Aглобально по всему топику
Bтолько внутри одной партиции
Cтолько между разными топиками
Dникогда
Поддержать проект