Вопрос проверяет знание архитектурных сущностей RabbitMQ и понимание того, как сообщения маршрутизируются через exchange.
RabbitMQ состоит из очередей, обменников и привязок между ними. Сообщения отправляются не в очередь напрямую, а в exchange, который решает, в какую очередь их направить. Direct-exchange маршрутизирует по точному ключу, fanout рассылает сообщение во все очереди без условий, а headers-exchange использует соответствие заголовкам. Эта модель даёт гибкость маршрутизации и позволяет строить разные архитектуры взаимодействия сервисов.
Сердро RabbitMQ — концепция маршрутизации сообщений через exchange.
Producer — отправитель сообщений
Exchange — маршрутизатор сообщений
Queue — очередь сообщений (FIFO)
Binding — связь между exchange и очередью
Consumer — получатель сообщений
Routing key — ключ маршрутизации
Определение: Exchange — точка, которая принимает сообщения от продюсеров и направляет в очереди согласно правилам.
Процесс доставки сообщения:
producer → отправляет сообщение
exchange → выбирает подходящие очереди
queue → хранит сообщение
consumer → читает сообщение
Прямой отправки в очередь не происходит — только через exchange.
Существует несколько типов обменников:
direct
fanout
topic
headers
Вопрос фокусируется на первых трёх, кроме topic.
Определение: Direct exchange — маршрутизатор, который направляет сообщения по точному совпадению routing key.
Пример:
php
// binding: queueA ← ("key1")
// routing key: "key1" → попадёт в queueA
Используется, когда:
нужно точное соответствие маршрутов
разные типы задач идут в разные очереди
логика проста и предсказуема
Определение: Fanout exchange — рассылает сообщение во все очереди, привязанные к exchange, независимо от ключей.
Пример:
очередь A ← получит
очередь B ← получит
очередь C ← получит
Применение:
широковещательная рассылка
обновления кеша
нотификации всем воркерам
события pub/sub
Определение: Headers exchange маршрутизирует сообщения на основе заголовков, а не ключей.
Пример:
Binding:
x-match = all
type = "audit"
env = "prod"
Сообщение попадёт в очередь, если оба заголовка совпадают.
Применение:
сложные правила маршрутизации
когда routing key недостаточно
когда фильтрация происходит по множеству параметров
direct
маршрутизация по точному ключу
fanout
широковещательная рассылка во все очереди
headers
маршрутизация по заголовкам сообщения (поддерживает AND/OR логику)
RabbitMQ обеспечивает гибкую маршрутизацию сообщений через обменники. Direct подходит для точного распределения задач, fanout — для широковещательных рассылок, а headers — для сложных правил фильтрации.