Ответ
В RabbitMQ обменник (exchange) получает сообщения от издателей (producers) и направляет их в одну или несколько очередей (queues). Тип обменника определяет логику маршрутизации.
Существует четыре основных типа:
-
direct- Принцип работы: Сообщение направляется в очереди, чей ключ привязки (
binding key) в точности совпадает с ключом маршрутизации (routing key) сообщения. - Сценарий использования: Одноадресная рассылка (unicast), когда нужно доставить сообщение конкретному обработчику. Например, отправка задачи в очередь для определенного воркера.
- Принцип работы: Сообщение направляется в очереди, чей ключ привязки (
-
fanout- Принцип работы: Сообщение рассылается во все привязанные к нему очереди, игнорируя ключ маршрутизации.
- Сценарий использования: Широковещательная рассылка (broadcast). Идеально подходит для массовых уведомлений, обновления кэша у всех инстансов приложения или спортивных новостей в реальном времени.
-
topic- Принцип работы: Маршрутизация по шаблону. Ключ маршрутизации сообщения сравнивается с шаблоном ключа привязки. Используются подстановочные символы:
*(звездочка) — заменяет ровно одно слово.#(решетка) — заменяет ноль или более слов.
- Сценарий использования: Многоадресная рассылка (multicast) по подписке. Например, система логирования, где подписчики могут получать сообщения определенного уровня (
*.error) или от определенного сервиса (auth.#).
- Принцип работы: Маршрутизация по шаблону. Ключ маршрутизации сообщения сравнивается с шаблоном ключа привязки. Используются подстановочные символы:
-
headers- Принцип работы: Маршрутизация основана на совпадении заголовков (headers) сообщения, а не ключа маршрутизации. При привязке очереди указывается, должны ли совпадать все заголовки (
x-match: all) или любой из них (x-match: any). - Сценарий использования: Сложные сценарии маршрутизации, где возможностей ключей недостаточно.
- Принцип работы: Маршрутизация основана на совпадении заголовков (headers) сообщения, а не ключа маршрутизации. При привязке очереди указывается, должны ли совпадать все заголовки (
Также существует безымянный (default) обменник, который является direct-обменником. Каждая созданная очередь автоматически привязывается к нему с ключом привязки, равным имени очереди.