Перейти к основному содержимому
Нормативная версия документации - английская

Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.

Типы обменников

Обменник каждого типа выбирает очереди по своей части сообщения: по ключу маршрутизации, по шаблону над ним, ни по чему или по заголовкам.

Одно сообщение с ключом маршрутизации order.eu.placed и заголовком region=eu, отправленное в обменники пяти типов, и очереди, которые выбирает каждыйТипы обменниковСообщение: ключ маршрутизации order.eu.placed,заголовок region = eudirectключ равен привязкеОчереди с привязкойorder.eu.placedtopicключ подходит под шаблонОчереди с привязкойorder.*.placed или order.#fanoutключ не учитываетсяКаждая привязаннаяк нему очередьheadersx-match = all или anyОчереди, привязка которыхтребует region = eux-consistent-hashплагин: хеш ключаОдна очередь, выбраннаяпропорционально её весу
Схема текстом
  1. Типы обменников: direct ключ равен привязке; Очереди с привязкой order.eu.placed; topic ключ подходит под шаблон; Очереди с привязкой order.*.placed или order.#; fanout ключ не учитывается; Каждая привязанная к нему очередь; headers x-match = all или any; Очереди, привязка которых требует region = eu; x-consistent-hash плагин: хеш ключа; Одна очередь, выбранная пропорционально её весу
  2. Сообщение: ключ маршрутизации order.eu.placed, заголовок region = eu → Типы обменников: публикуется в
  3. direct ключ равен привязке → Очереди с привязкой order.eu.placed
  4. topic ключ подходит под шаблон → Очереди с привязкой order.*.placed или order.#
  5. fanout ключ не учитывается → Каждая привязанная к нему очередь
  6. headers x-match = all или any → Очереди, привязка которых требует region = eu
  7. x-consistent-hash плагин: хеш ключа → Одна очередь, выбранная пропорционально её весу

Обменник типа direct копирует сообщение в каждую очередь, привязанную с ключом, равным ключу маршрутизации сообщения. Обменник по умолчанию - это обменник типа direct, к которому каждая очередь привязана под своим именем.

Обменник типа topic читает ключ маршрутизации как слова, разделённые точками. Привязка - это шаблон над этими словами: * обозначает ровно одно слово, а # - ноль или больше слов. Ключ order.eu.placed подходит под order.*.placed и order.#, но не под order.*.

Обменник типа fanout не учитывает ключ и копирует сообщение в каждую привязанную к нему очередь.

Обменник типа headers тоже не учитывает ключ. Он сравнивает заголовки сообщения с аргументами привязки. Если x-match равен all, должен совпасть каждый аргумент, если any - достаточно одного. В этом крейте привязку с аргументами задаёт bind_with.

Сообщение может подойти под несколько привязок. Тогда оно попадает в каждую подходящую очередь, по одному разу в каждую.

Обменник с согласованным хешированием входит в плагин, который поставляется с RabbitMQ и требует включения. Он хеширует ключ маршрутизации и отправляет сообщение в одну привязанную очередь. Ключ привязки - её вес: очередь с весом 2 получает примерно вдвое больше ключей, чем очередь с весом 1. В обычной работе сообщения с одним ключом маршрутизации попадают в одну очередь; перезапуск узла может перенести ключ в другую очередь. Крейт предоставляет этот обменник как RabbitExchange::consistent_hash при фиче plugin-consistent-hash, а страница Партиции воркеров и порядок сравнивает его с партициями воркеров внутри одной подписки.

RabbitExchange называет обменник привязки. custom называет любой другой тип, который добавляет плагин.

Правила маршрутизации задаёт RabbitMQ (обменники, обменники типа topic, обменник с согласованным хешированием).