В предыдущей главе мы рассмотрели пример использования функции публикации и подписки в
rabbitmq
, который использует один из типов обменников —Fanout exchange (распределительный обменник)
. Сегодня мы поговорим о других типах обменников.
Давайте рассмотрим процесс создания и отправки сообщения в rabbitmq
:
(1). Производитель: отвечает за создание сообщений.
(2). Обменник: перенаправляет полученные сообщения в соответствии с правилами маршрутизации в определенные очереди.
(3). Очередь: хранилище сообщений.
(4). Потребитель: получает и обрабатывает сообщения.Примечание: В процессе обработки сообщений в rabbitmq
, производитель не отправляет сообщения напрямую потребителю, а просто отправляет их в случайный (неуказанный) обменник, а затем обменник перенаправляет сообщения в определенные очереди в соответствии с правилами маршрутизации. Однако такой подход может привести к отправке сообщений в несколько очередей, что может привести к получению нежелательных данных. Также сообщения могут теряться. Поэтому при обычном использовании rabbitmq
необходимо указывать конкретный обменник для отправки сообщений в определенные очереди. Что касается потери сообщений, мы рассмотрим позже операции по сохранению сообщений в rabbitmq
.### 2. Четыре типа обменников
rabbitmq
разделяет обменники на четыре типа в зависимости от процесса маршрутизации:
Direct exchange (прямой обменник)
Topic exchange (тематический обменник)
Headers exchange (обменник по заголовкам)
Fanout exchange (распределительный обменник)
Дополнительное пояснение: хотя официально утверждается, что существует четыре типа обменников, на самом деле существует несколько дополнительных типов, таких как по умолчанию обменник
, amq.* обменники (amq. начинающиеся обменники)
, а также Dead Letter Exchange (обменник для погибших сообщений)
. Об обменнике для погибших сообщений мы поговорим позже.
Прямой обмен (direct exchange) отправляет сообщения в соответствующие очереди на основе маршрутизационного ключа (routing key), который содержится в сообщении. Пример:
phpassn_routing
phpassn_queue
phpassn_exchange
Их взаимосвязь такова: очередь связывается (bind) с обменником, при этом ей присваивается маршрутизационный ключ (phpassn_routing). Когда сообщение с маршрутизационным ключом phpassn_routing
поступает в обменник, он находит связь с этим ключом и отправляет сообщение в соответствующую очередь. Этот подход напоминает однозначное соответствие. Ниже приведена схема, где красные кресты указывают на несоответствующие пути.
Как видно, последняя очередь не соответствует ключу маршрутизации, поэтому обменник не отправит сообщение в эту очередь.
В текущих проектах нашей компании обмен по заголовкам ещё не используется. Однако, так как это кластерная модель, я расскажу о том, как я настроил его на локальной машине. Обмен по заголовкам очень похож на тематический обмен, так как оба используют правила маршрутизации для проверки соответствия и распределения сообщений. Однако, в отличие от тематического обмена, который использует ключ маршрутизации для проверки соответствия, обмен по заголовкам использует свойства сообщения для его распределения. Это происходит путём сравнения значений заголовков сообщения с заданными параметрами привязки.В обмене по заголовкам есть специальный параметр ”x-match”
, который используется для проверки соответствия значений заголовков:
”x-match”
установлено как "any"
, сообщение будет отправлено, если хотя бы одно значение заголовка соответствует параметрам привязки.”x-match”
установлено как "all"
, сообщение будет отправлено только если все значения заголовков соответствуют параметрам привязки (что делает это требование более строгим).Пример: Очередь A: привязана к обменнику с параметрами: logs1='phpassn', log2='www.phpassn.com' Очередь B: привязана к обменнику с параметрами: logs1='phpassn1', log2='www.phpassn.com2' Очередь C: привязана к обменнику с параметрами: logs1='phpassn2', log2='www.phpassn.com3' Очередь D: привязана к обменнику с параметрами: logs1='phpassn', log2='www.phpassn.com1'
Сообщение 1 отправляется с заголовками: logs1='phpassn', log2='www.phpassn.com' с правилом соответствия x-match=all
Сообщение 2 отправляется с заголовками: logs1='phpassn' с правилом соответствия x-match=any
Сообщение 3 отправляется с заголовками: logs1='phpassn5' log2='www.phpassn.com5' с правилом соответствия x-match=any
Можно очень хорошо увидеть, что последнее сообщение Message3 не прошло фильтрацию через обменник и, следовательно, было отброшено.
Заключение: все приведенные выше схемы были нарисованы вручную и не являются очень красивыми. Эти четыре типа обменников являются наиболее распространенными. Если вам это нужно, вы можете самостоятельно изучить!
Вот несколько типов обменников по умолчанию:
Исходная статья: https://www.phpassn.com/article/102.html
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )