Вопрос проверяет понимание маршрутизации сообщений в RabbitMQ и типов exchange.
В RabbitMQ основные типы exchange: direct, fanout, topic и headers. Они отличаются правилами маршрутизации сообщений в очереди. direct сопоставляет routing key, fanout рассылает всем, topic использует шаблоны, а headers — значения заголовков. Выбор зависит от схемы маршрутизации.
Exchange — это компонент RabbitMQ, который принимает сообщение от продюсера и решает, в какие очереди его отправить.
Exchange не хранит сообщения, он только маршрутизирует их.
Direct exchange
Маршрутизация происходит по точному совпадению routing key.
Пример:
сообщение с ключом order.created
очередь привязана к order.created
сообщение попадёт в очередь
Fanout exchange
Сообщение отправляется во все связанные очереди независимо от ключа.
Используется, когда:
нужно рассылать события всем подписчикам
реализуется broadcast
Topic exchange
Routing key сопоставляется с шаблоном.
Пример шаблонов:
order.*
user.#
Это позволяет строить гибкую маршрутизацию.
Headers exchange
Маршрутизация выполняется по заголовкам сообщения, а не по routing key.
Используется реже, когда логика маршрутизации сложнее и основана на метаданных.
Типичный поток:
Producer отправляет сообщение
Exchange принимает сообщение
Exchange анализирует правила
Сообщение отправляется в одну или несколько очередей
На практике чаще всего:
direct — для простых сервисов
topic — для событийных систем
fanout — для широковещательных уведомлений
Headers применяется значительно реже.
Тип exchange определяет логику маршрутизации сообщений. В большинстве production-систем основная нагрузка ложится на direct и topic, так как они дают баланс простоты и гибкости.