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

Рассылающий обмен
Рассылающий обмен направляет сообщения во все очереди, связанные с ним, игнорируя ключ маршрутизации. Если N очередей связаны с рассылающим обменом, когда новое сообщение публикуется в обмен, копия этого сообщения будет доставлена во все N очередей. Рассылающие обмены особенно подходят для прямых трансляций сообщений.
Поскольку рассылающий обмен доставляет копии сообщений в каждую очередь, с которой он связан, его сценарии использования довольно похожи:
- Игры в жанре Massive Multiplayer Online (MMO) могут использовать его для обновления таблиц лидеров или других глобальных событий.
- Спортивные новостные сайты могут использовать рассылающие обмены для распределения обновлений результатов мобильным клиентам почти в реальном времени.
- Распределенные системы могут транслировать различные обновления статусов и конфигураций.
- Групповые чаты могут использовать рассылающие обмены для распространения сообщений среди участников (хотя AMQP не имеет внутреннего понятия о присутствии, что делает XMPP возможно более подходящим выбором).

Тематический обмен
Тематический обмен направляет сообщения в одну или несколько очередей на основании соответствия ключа маршрутизации сообщения с шаблоном, используемым для связывания очередей с обменом. Типы тематических обменов обычно используются для реализации различных вариантов модели публикации/подписки. Тематические обмены обычно используются для многоадресной маршрутизации сообщений.
У тематических обменов существует очень широкий спектр сценариев использования. В случаях, когда в вопросах участвуют несколько потребителей или приложения, выбирающие типы сообщений, которые они хотят получать, следует рассмотреть возможность использования тематических обменов.
Обмен заголовками
Обмен заголовками предназначен для маршрутизации на основании нескольких атрибутов, которые проще представить в виде заголовков сообщения, чем ключей маршрутизации. Обмены заголовками игнорируют атрибут ключа маршрутизации. Вместо этого атрибуты, используемые для маршрутизации, берутся из атрибута заголовков. Если значения заголовков равны тем, что указаны в момент связывания, сообщение считается соответствующим.
Для связывания очередей с обменом заголовков можно использовать несколько заголовков. В этом случае брокер требует дополнительной информации от разработчика приложения, а именно, следует ли учитывать сообщения, которые соответствуют любому из заголовков или всем заголовкам. Для этого и предназначен параметр связывания "x-match". Когда параметр "x-match" установлен на "any", требуется только одно совпадающее значение заголовка. В качестве альтернативы, установка "x-match" на "all" требует, чтобы все значения совпадали.
Очередь
Очереди в модели AMQP 0-9-1 весьма похожи на очереди в других системах передачи сообщений и управления заданиями: они используются для хранения сообщений, которые используют приложения. Очереди имеют некоторые общие свойства с обменами, но также имеют и дополнительные свойства:
- Имя
- Долговечность: Очередь будет сохраняться после перезапуска брокера.
- Эксклюзивность: Используется только одним подключением, и очередь будет удалена, когда это подключение закроется.
- Автоудаление: Очередь будет удалена, когда последний потребитель от подписи, при условии, что существует хотя бы один потребитель.
- Аргументы: Необязательные, используются плагинами и специфическими для брокера функциями, такими как TTL сообщения, ограничения длины очереди и т. д.
Очереди должны быть объявлены до того, как их можно будет использовать. Объявление очереди создаст ее, если она еще не существует. Если очередь уже существует и ее свойства соответствуют тем, что указаны в объявлении, это объявление будет проигнорировано. Если свойства существующей очереди отличаются от указанных в объявлении, будет вызвано исключение уровня канала с кодом 406 (PRECONDITION_FAILED).
Связка
Связка относится к правилам, которые направляют сообщения от обмена к очереди. Для того чтобы обмен E направлял сообщения в очередь Q, очередь Q должна быть связана с обменом E. Связки могут иметь необязательные атрибуты ключа маршрутизации, которые используются определенными типами обменов. Ключ маршрутизации служит фильтром для определения того, какие связанные очереди должны получать сообщения при их публикации в обмен.
Наличие этого слоя косвенности позволяет реализовать схемы маршрутизации, которые было бы невозможно или трудно достигнуть, публикуя сообщения напрямую в очередь, и также устраняет определенную степень дублирования работы, которую должны выполнять разработчики приложений.
Если сообщение не может быть направлено ни в одну очередь (например, потому что нет связок с обменом, в который оно было опубликовано), сообщение будет отменено или возвращено издателю в зависимости от свойств сообщения, установленных издателем.