Из чего состоит Exchange в брокерах сообщений (например, RabbitMQ)?

«Из чего состоит Exchange в брокерах сообщений (например, RabbitMQ)?» — вопрос из категории Брокеры сообщений, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В RabbitMQ (и в аналогичных AMQP-брокерах) Exchange (обменник) — это ключевой компонент, который получает сообщения от продюсеров и решает, в какие очереди их направить. Я сталкивался с этим при тестировании асинхронных микросервисов.

Exchange состоит из:

  1. Имя (Name): Уникальный идентификатор обменника в пределах виртуального хоста.
  2. Тип (Type): Алгоритм маршрутизации сообщений. Основные типы:
    • Direct: Сообщение идет в очередь, чей routing key полностью совпадает с routing key сообщения. Используется для точечной отправки.
    • Fanout: Сообщение рассылается во все привязанные очереди, игнорируя routing key. Используется для широковещательных уведомлений.
    • Topic: Сообщение направляется в очереди, чья привязка (binding key) совпадает с routing key сообщения по шаблону (с использованием * и #). Используется для сложной маршрутизации по событиям.
    • Headers: Маршрутизация происходит на основе заголовков сообщения (атрибутов headers), а не routing key. Более гибкий, но и более сложный тип.
  3. Привязки (Bindings): Правила, которые связывают Exchange с очередями. Привязка может включать routing key (или binding key) и дополнительные аргументы.
  4. Атрибуты (Attributes): Дополнительные свойства, такие как durable (сохраняется ли Exchange после перезагрузки брокера) и auto-delete (удалить ли Exchange, когда все очереди отвяжутся от него).

Практический пример для тестирования: При тестировании сервиса уведомлений мы использовали Exchange типа topic с именем notifications.topic. Сервис рассылки отправлял сообщение с routing_key="user.123.email". Это сообщение попадало в две очереди: email.queue (шаблон привязки user.*.email) и user.123.archive.queue (шаблон user.123.*). Моя задача была убедиться, что сообщение действительно появилось в обеих очередях и было корректно обработано соответствующими потребителями.