• Русский
  • Основные понятия

    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.

    Direct Message Distributor

    Fanout Exchange

    Fanout exchange направляет сообщения во все очереди, привязанные к нему, игнорируя routing key. Если к fanout exchange привязано N очередей, при публикации нового сообщения в exchange копия этого сообщения будет доставлена во все N очередей. Fanout exchange особенно подходит для широковещательной рассылки сообщений.

    Поскольку fanout exchange доставляет копии сообщений каждой привязанной очереди, его сценарии использования схожи:

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

    Fanout Message Distributor

    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, в который оно было опубликовано), сообщение будет отброшено или возвращено отправителю, в зависимости от свойств сообщения, установленных отправителем.