Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Типы обменников
Обменник каждого типа выбирает очереди по своей части сообщения: по ключу маршрутизации, по шаблону над ним, ни по чему или по заголовкам.
Схема текстом
- Типы обменников: direct ключ равен привязке; Очереди с привязкой order.eu.placed; topic ключ подходит под шаблон; Очереди с привязкой order.*.placed или order.#; fanout ключ не учитывается; Каждая привязанная к нему очередь; headers x-match = all или any; Очереди, привязка которых требует region = eu; x-consistent-hash плагин: хеш ключа; Одна очередь, выбранная пропорционально её весу
- Сообщение: ключ маршрутизации order.eu.placed, заголовок region = eu → Типы обменников: публикуется в
- direct ключ равен привязке → Очереди с привязкой order.eu.placed
- topic ключ подходит под шаблон → Очереди с привязкой order.*.placed или order.#
- fanout ключ не учитывается → Каждая привязанная к нему очередь
- headers x-match = all или any → Очереди, привязка которых требует region = eu
- 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, обменник с согласованным хешированием).