1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/jonny-li-rabbitmq-study

В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
05-最适合入门的RabbitMQ+PHP教程(五)交换机类型.md 11 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 02.06.2025 18:34 9a50763

В предыдущей главе мы рассмотрели пример использования функции публикации и подписки в rabbitmq, который использует один из типов обменников — Fanout exchange (распределительный обменник). Сегодня мы поговорим о других типах обменников.

Основные разделы

  1. Для чего используются обменники и какова их роль?
  2. Четыре типа обменников и их графическое представление!

1. Для чего используются обменники?

Давайте рассмотрим процесс создания и отправки сообщения в rabbitmq: (1). Производитель: отвечает за создание сообщений. (2). Обменник: перенаправляет полученные сообщения в соответствии с правилами маршрутизации в определенные очереди. (3). Очередь: хранилище сообщений. (4). Потребитель: получает и обрабатывает сообщения.Примечание: В процессе обработки сообщений в rabbitmq, производитель не отправляет сообщения напрямую потребителю, а просто отправляет их в случайный (неуказанный) обменник, а затем обменник перенаправляет сообщения в определенные очереди в соответствии с правилами маршрутизации. Однако такой подход может привести к отправке сообщений в несколько очередей, что может привести к получению нежелательных данных. Также сообщения могут теряться. Поэтому при обычном использовании rabbitmq необходимо указывать конкретный обменник для отправки сообщений в определенные очереди. Что касается потери сообщений, мы рассмотрим позже операции по сохранению сообщений в rabbitmq.### 2. Четыре типа обменников

rabbitmq разделяет обменники на четыре типа в зависимости от процесса маршрутизации:

  1. Direct exchange (прямой обменник)
  2. Topic exchange (тематический обменник)
  3. Headers exchange (обменник по заголовкам)
  4. Fanout exchange (распределительный обменник)

Дополнительное пояснение: хотя официально утверждается, что существует четыре типа обменников, на самом деле существует несколько дополнительных типов, таких как по умолчанию обменник, amq.* обменники (amq. начинающиеся обменники), а также Dead Letter Exchange (обменник для погибших сообщений). Об обменнике для погибших сообщений мы поговорим позже.

Прямой обмен (Direct Exchange)

Прямой обмен (direct exchange) отправляет сообщения в соответствующие очереди на основе маршрутизационного ключа (routing key), который содержится в сообщении. Пример:

  1. Маршрутизационный ключ: phpassn_routing
  2. Очередь: phpassn_queue
  3. Обменник: phpassn_exchange

Их взаимосвязь такова: очередь связывается (bind) с обменником, при этом ей присваивается маршрутизационный ключ (phpassn_routing). Когда сообщение с маршрутизационным ключом phpassn_routing поступает в обменник, он находит связь с этим ключом и отправляет сообщение в соответствующую очередь. Этот подход напоминает однозначное соответствие. Ниже приведена схема, где красные кресты указывают на несоответствующие пути. photo.png

Тематический обмен (Topic exchange)Тематический обменник похож на модель публикации/подписки в Redis. Это когда сообщения, созданные производителем, маршрутизируются обменником на основе ключа маршрутизации и отправляются в одну или несколько очередей, связанных с обменником. Тематический обменник похож на фан-вход, но можно сказать, что он работает как математическое абсолютное соответствие или как регулярное выражение в PHP: сообщение будет отправлено только в те очереди, которые соответствуют ключу маршрутизации. На рисунке ниже это наглядно показано:

photo.png

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

Обмен по заголовкам (Headers exchange)

В текущих проектах нашей компании обмен по заголовкам ещё не используется. Однако, так как это кластерная модель, я расскажу о том, как я настроил его на локальной машине. Обмен по заголовкам очень похож на тематический обмен, так как оба используют правила маршрутизации для проверки соответствия и распределения сообщений. Однако, в отличие от тематического обмена, который использует ключ маршрутизации для проверки соответствия, обмен по заголовкам использует свойства сообщения для его распределения. Это происходит путём сравнения значений заголовков сообщения с заданными параметрами привязки.В обмене по заголовкам есть специальный параметр ”x-match”, который используется для проверки соответствия значений заголовков:

  1. Когда ”x-match” установлено как "any", сообщение будет отправлено, если хотя бы одно значение заголовка соответствует параметрам привязки.
  2. Когда ”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=anyphoto.png

Можно очень хорошо увидеть, что последнее сообщение Message3 не прошло фильтрацию через обменник и, следовательно, было отброшено.

Fanout Exchange (распределительный обменник)Это, вероятно, самый часто используемый тип. Распределительный обменник (fanout exchange) направляет сообщения во все привязанные к нему очереди, при этом ключи маршрутизации игнорируются, поэтому их можно просто оставить пустыми. Поскольку сообщения могут быть отправлены непосредственно в соответствующие очереди, привязанные к обменнику, он работает как радиостанция, распространяющая сообщения всем привязанным очередям. Этот тип обменника хорошо подходит для публикации/подписки.photo.png

Заключение: все приведенные выше схемы были нарисованы вручную и не являются очень красивыми. Эти четыре типа обменников являются наиболее распространенными. Если вам это нужно, вы можете самостоятельно изучить!

Вот несколько типов обменников по умолчанию: photo.png

Исходная статья: https://www.phpassn.com/article/102.html

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/jonny-li-rabbitmq-study.git
git@api.gitlife.ru:oschina-mirror/jonny-li-rabbitmq-study.git
oschina-mirror
jonny-li-rabbitmq-study
jonny-li-rabbitmq-study
master