Этот вопрос проверяет понимание ключевого компонента RabbitMQ — Exchange, который отвечает за маршрутизацию сообщений от продюсера к нужным очередям.
Exchange в RabbitMQ — это "почтовое отделение", которое получает сообщения от отправителей и решает, в какие очереди их направить. Тип Exchange определяет правила этой маршрутизации. Основные типы: Direct (отправляет в очередь с совпадающим ключом маршрутизации), Fanout (рассылает во все привязанные очереди, игнорируя ключ), Topic (отправляет в очереди, чей ключ совпадает с шаблоном) и Headers (маршрутизирует на основе атрибутов сообщения, а не ключа). Default Exchange — это предустановленный Direct Exchange, куда сообщения попадают автоматически.
В RabbitMQ продюсеры не отправляют сообщения напрямую в очередь. Вместо этого они публикуют сообщения в Exchange. Exchange отвечает за маршрутизацию — он получает сообщение и направляет его в одну или несколько очередей. Для этого между Exchange и очередью устанавливается привязка (binding), которая может включать дополнительный ключ маршрутизации.
Direct Exchange
Принцип работы: Сообщение отправляется в ту очередь, ключ привязки которой binding key точно совпадает с ключом маршрутизации сообщения routing key.
Использование: Точечная отправка сообщений конкретному получателю. Например, для отправки уведомления конкретному пользователю, где routing_key — это его ID.
Fanout Exchange
Принцип работы: Рассылает копию сообщения во все очереди, которые к нему привязаны. Routing key игнорируется.
Использование: Широковещательные уведомления, например, рассылка одного сообщения для обновления кеша во всех сервисах одновременно.
Topic Exchange
Принцип работы: Сообщение отправляется в очереди, чей ключ привязки совпадает с routing key сообщения по определенному шаблону. Шаблоны могут использовать символы * (заменяет одно слово) и # (заменяет ноль или несколько слов). Слова разделяются точкой.
Использование: Групповые уведомления, основанные на теме или категории. Например, logs.application.error попадет в очередь с привязкой logs.application.* или logs.#.
Headers Exchange
Принцип работы: Игнорирует routing key. Маршрутизация основана на заголовках сообщения (аргументах в виде ключ-значение). Привязка указывает условия сопоставления (x-match: all — все заголовки должны совпасть, x-match: any — достаточно любого совпадения).
Использование: Более сложная маршрутизация, основанная на атрибутах, а не на ключе. Используется реже.
Default Exchange
Принцип работы: Это предсозданный Direct Exchange с именем "" (пустая строка). Каждая создаваемая очередь автоматически привязывается к нему с routing key, равным имени очереди.
Использование: Если отправить сообщение в Default Exchange с routing_key = "имя_очереди", оно попадет прямо в указанную очередь.
Вывод:
Выбор типа Exchange зависит от стратегии маршрутизации:
Direct — для отправки конкретному "подписчику".
Fanout — для массовой рассылки.
Topic — для гибкой групповой маршрутизации по шаблонам.
Headers — для маршрутизации по сложным атрибутам сообщения.