Exchange, Queue, Binding
В RabbitMQ Producer не отправляет сообщение напрямую в очередь — он отправляет в Exchange, который решает, в какие очереди его направить, по правилам маршрутизации (Binding).
Queue — собственно очередь, откуда Consumer забирает сообщения. Binding — правило, связывающее Exchange и конкретную очередь.
Копнуть глубже
Типы Exchange — разная логика маршрутизации:
| Тип | Как маршрутизирует |
|---|---|
| Direct | по точному совпадению ключа маршрутизации (routing key) |
| Fanout | рассылает копию во все привязанные очереди разом |
| Topic | по шаблону ключа (например, order.* — все события заказов) |
| Headers | по заголовкам сообщения, а не по ключу |
// Fanout — копия уйдёт сразу и в email-очередь, и в sms-очередь
@Bean
FanoutExchange notificationExchange() { return new FanoutExchange("notifications"); }
Зачем такая гибкость, если в Kafka проще (просто топик). RabbitMQ изначально проектировался под сложные сценарии маршрутизации в распределённых системах — например, отправить уведомление только определённой категории получателей (Topic Exchange с шаблоном order.eu.* для заказов из Европы), или разослать всем заинтересованным сервисам разом (Fanout) без необходимости знать заранее, сколько их и какие. Эта гибкость — главное архитектурное отличие от более простой модели “топик → consumer’ы” у Kafka.
• разницу между Direct, Fanout и Topic Exchange (если дошёл до 2-го слоя).