Очереди сообщений и брокеры: 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
| Свойство | RabbitMQ | Kafka |
| Модель | классическая очередь | распределённый лог |
| После прочтения | сообщение удаляется | хранится (можно перечитать) |
| Маршрутизация | гибкая (exchange, routing keys) | простая, по топикам/партициям |
| Пропускная способность | высокая | очень высокая (миллионы msg/с) |
| Сильная сторона | сложная маршрутизация задач | потоки событий, аналитика, лог |
| Типичный кейс | фоновые задачи, RPC | event streaming, метрики, ленты |
Партиции и порядок (Kafka)
Топик в Kafka делится на партиции — это и есть его горизонтальное масштабирование. Порядок гарантируется только внутри партиции, не глобально. Сообщения с одним ключом (например, user_id) попадают в одну партицию, поэтому события одного пользователя обрабатываются по порядку. Это та же идея шардирования, что и в базах.
Что сказать на собеседовании
«Нужны фоновые задачи с гибкой маршрутизацией и подтверждениями — возьму RabbitMQ. Нужен поток событий с высокой пропускной способностью, хранением и возможностью перечитать (лента, аналитика, event sourcing) — возьму Kafka». Назвать почему важнее, чем назвать модную технологию.
Итог
- Брокер развязывает сервисы, сглаживает пики и не теряет задачи при падении обработчика.
- RabbitMQ — классическая очередь с гибкой маршрутизацией; Kafka — распределённый лог с хранением и огромной пропускной способностью.
- В Kafka масштаб и порядок дают партиции; один ключ → одна партиция → порядок для этого ключа.