middle
Зачем нужен Message Broker? В чём разница между очередью и топиком?
Message Broker (брокер сообщений) – промежуточное ПО, которое принимает, хранит и доставляет сообщения между компонентами системы. Это как почтовое отделение: отправитель бросает письмо в ящик и уходит, а почта доставит его получателю, даже если тот сейчас не дома.
Зачем нужен
- Слабая связанность – отправитель не знает получателя и не зависит от него.
- Асинхронность – отправитель не ждёт обработки, что снижает время отклика.
- Буферизация – сглаживание пиков нагрузки: если получатель временно не справляется, сообщения копятся в очереди.
- Гарантия доставки – сообщение не потеряется при временном сбое получателя.
- Масштабируемость – можно добавлять потребителей динамически.
Очередь (Queue) vs Топик (Topic)
Пример
Очередь (Queue) — Point-to-Point:
Каждое сообщение обрабатывается ОДНИМ потребителем.
Producer → [ msg3 | msg2 | msg1 ] → Consumer A (получит msg1)
→ Consumer B (получит msg2)
→ Consumer C (получит msg3)
Топик (Topic) — Publish/Subscribe:
Каждое сообщение получают ВСЕ подписчики (группы).
┌→ Consumer Group A (получит ВСЕ сообщения)
Producer → [ Topic ] ─────────┼→ Consumer Group B (получит ВСЕ сообщения)
└→ Consumer Group C (получит ВСЕ сообщения)
| Аспект | Очередь (Queue) | Топик (Topic) |
|---|---|---|
| Модель | Point-to-Point | Pub/Sub |
| Получатели | Один на сообщение | Все подписчики |
| Сценарий | Обработка задач (worker pool) | Уведомление нескольких систем |
| Пример | Обработка платежей (каждый платёж обрабатывается одним воркером) | Событие “Платёж совершён” – отправить уведомление, обновить аналитику, проверить фрод |
Популярные брокеры
| Брокер | Модель | Особенности |
|---|---|---|
| Apache Kafka | Topic (лог) | Высокая пропускная способность, хранение истории, replay |
| RabbitMQ | Queue / Topic (exchange) | Гибкая маршрутизация, поддержка AMQP |
| ActiveMQ | Queue / Topic | JMS-совместимый, зрелый |
| Redis Streams | Topic (лог) | Простой, быстрый, встроен в Redis |
Kafka: Consumer Groups
В Kafka каждый Consumer Group – это логический подписчик. Внутри группы сообщения распределяются между потребителями (как очередь), но между группами – доставляются всем (как топик). Это позволяет совмещать оба подхода в одной системе.
На собеседовании: Интервьюер ждёт чёткого понимания разницы Queue vs Topic и умения привести пример, когда нужен каждый из них. Частая ошибка – путать Consumer Group в Kafka с обычной очередью.