Этот вопрос проверяет знание ключевого компонента RabbitMQ — Exchange, который отвечает за маршрутизацию сообщений в очередях.
В RabbitMQ существуют четыре основных типа Exchange, которые определяют, как сообщение будет routed к очередям. Direct отправляет сообщение в очередь, чей routing key точно совпадает с ключом сообщения. Fanout просто рассылает копии сообщения во все привязанные к нему очереди, игнорируя routing key. Topic позволяет использовать шаблоны (с * и #) для гибкого сопоставления routing key. Headers игнорирует routing key и маршрутизирует сообщения на основе заголовков.
Exchange в RabbitMQ — это сущность, которая получает сообщения от продюсеров и перенаправляет их в очереди согласно определенным правилам (типу exchange и привязкам — bindings).
Direct Exchange
Принцип работы: Сравнивает routing key сообщения с routing key привязки очереди. Сообщение попадает в очередь только при полном совпадении.
Аналог из жизни: Точечная доставка письма по конкретному адресу.
Пример использования: Отправка задачи в конкретную очередь-обработчик (например, queue.payments).
Fanout Exchange
Принцип работы: Рассылает копию каждого полученного сообщения во все очереди, которые к нему привязаны. Routing key игнорируется.
Аналог из жизни: Рассылка рекламной листовки всем жителям дома.
Пример использования: Уведомление всех подсистем о важном событии (например, "пользователь зарегистрировался"), когда каждая подсистема должна обработать это событие независимо.
Topic Exchange
Принцип работы: Использует routing key, который представляет собой строку, разделенную точками (например, user.registered.email). Очередь привязывается с помощью шаблона, где * заменяет одно слово, а # — ноль или несколько слов.
Аналог из жизни: Подписка на новости по темам.
Пример использования:
Очередь с шаблоном *.error получит все сообщения об ошибках.
Очередь с шаблоном user.registered.* получит все сообщения о регистрации пользователя.
Headers Exchange
Принцип работы: Игнорирует routing key. Маршрутизация основана на заголовках сообщения (аргументы headers). Привязка очереди указывает условия сопоставления (x-match: all — все заголовки должны совпасть, x-match: any — достаточно любого).
Пример использования: Более сложная маршрутизация, где ключ неудобно выражать строкой, например, отправка сообщения в зависимости от типа контента и версии API.
Вывод: Выбор типа Exchange зависит от требуемой логики маршрутизации. Direct — для точечной доставки, Fanout — для широковещательной рассылки, Topic — для гибкой маршрутизации по шаблонам, а Headers — для сложных условий, основанных на атрибутах сообщения.