Основные понятия
Exchange
Существует несколько типов exchange, чтобы поддерживать различные модели распределения сообщений.
Direct Exchange
Direct exchange маршрутизирует сообщения в очереди на основе routing key сообщения. Direct exchange идеально подходит для unicast-маршрутизации сообщений, но также может использоваться для multicast-маршрутизации.
Работа происходит следующим образом:
- Очереди привязываются к exchange с использованием routing key K.
- Когда новое сообщение поступает в direct exchange с routing key R, если K = R, exchange направляет его в очередь.
- Если несколько очередей привязаны к direct exchange с одинаковым routing key K, exchange направит сообщение во все очереди, где K = R.

Fanout Exchange
Fanout exchange направляет сообщения во все очереди, привязанные к нему, игнорируя routing key. Если к fanout exchange привязано N очередей, при публикации нового сообщения в exchange копия этого сообщения будет доставлена во все N очередей. Fanout exchange особенно подходит для широковещательной рассылки сообщений.
Поскольку fanout exchange доставляет копии сообщений каждой привязанной очереди, его сценарии использования схожи:
- MMO-игры могут использовать его для обновления таблиц лидеров или других глобальных активностей.
- Спортивные новостные сайты могут использовать fanout exchange для почти реального времени распространения обновлений счетов на мобильные клиенты.
- Распределённые системы могут транслировать различные обновления статуса и конфигурации.
- Групповые чаты могут использовать fanout exchange для распространения сообщений среди участников (хотя AMQP не имеет встроенного понятия присутствия, поэтому XMPP может быть лучшим выбором).

Topic Exchange
Topic exchange маршрутизирует сообщения в одну или несколько очередей на основе совпадения routing key сообщения с шаблоном, используемым для привязки очередей к exchange. Topic exchange часто используется для реализации различных вариантов модели publish/subscribe. Topic exchange обычно применяется для multicast-маршрутизации сообщений.
Topic exchange имеет очень широкий спектр применения. Всякий раз, когда речь идет о множестве потребителей или приложений, которые избирательно выбирают типы сообщений для получения, стоит рассматривать использование topic exchange.
Headers Exchange
Headers exchange предназначен для маршрутизации на основе множества атрибутов, которые проще представить в виде заголовков сообщений, чем routing key. Headers exchange игнорирует routing key. Вместо этого для маршрутизации используются атрибуты из headers. Если значения заголовков совпадают с указанными при привязке, сообщение считается подходящим.
Для привязки очередей к headers exchange для сопоставления можно использовать несколько заголовков. В этом случае брокеру требуется дополнительная информация от разработчика приложения — следует ли считать сообщение подходящим, если совпадает любой из заголовков, или все заголовки должны совпадать. Для этого служит параметр привязки "x-match". Если "x-match" установлен в "any", достаточно совпадения одного заголовка. Если "x-match" установлен в "all", требуется совпадение всех значений.
Queue
Очереди в модели AMQP 0-9-1 очень похожи на очереди в других системах обмена сообщениями и очередях задач: они используются для хранения сообщений, которые используют приложения. Очереди имеют некоторые свойства, общие с exchange, а также дополнительные:
- Имя
- Durable: очередь сохранится после перезапуска брокера.
- Exclusive: используется только одним соединением, и очередь будет удалена при закрытии этого соединения.
- Auto-delete: очередь будет удалена, когда последний потребитель отпишется, при условии, что был хотя бы один потребитель.
- Arguments: необязательные, используются плагинами и специфичными для брокера функциями, такими как TTL сообщений, ограничения длины очереди и др.
Очереди должны быть объявлены перед использованием. Объявление очереди создаст её, если она ещё не существует. Если очередь уже существует и её свойства совпадают с объявлением, объявление игнорируется. Если свойства существующей очереди отличаются от объявленных, будет вызвано исключение на уровне канала с кодом 406 (PRECONDITION_FAILED).
Binding
Binding — это правила, которые маршрутизируют сообщения от exchange к очереди. Чтобы exchange E мог направлять сообщения в очередь Q, очередь Q должна быть привязана к exchange E. Привязки могут иметь необязательные атрибуты routing key, используемые некоторыми типами exchange. Routing key служит фильтром, помогающим определить, какие привязанные очереди должны получать сообщения при публикации в exchange.
Наличие этого уровня косвенности позволяет реализовывать схемы маршрутизации, которые было бы невозможно или сложно выполнить при прямой публикации в очередь, а также устраняет дублирование работы, которую пришлось бы выполнять разработчикам приложений.
Если сообщение не может быть маршрутизировано ни в одну очередь (например, потому что нет привязок с exchange, в который оно было опубликовано), сообщение будет отброшено или возвращено отправителю, в зависимости от свойств сообщения, установленных отправителем.