Теперь пришло время подробнее объяснить exchanges, ключи маршрутизации и привязки. Мы поговорим о том, как exchanges и очереди связаны друг с другом, и приведем примеры того, как можно использовать различные типы exchanges в четырех различных сценариях.
Маршрутизация сообщений в правильные очереди
Первое, что нужно понять, — это то, что сообщения не публикуются напрямую в очереди. Вместо этого производитель отправляет сообщения через exchange. Вы можете представить exchange как человека, доставляющего почту, который гарантирует, что сообщение попадет в правильную очередь.
То, как сообщение перемещается, зависит от нескольких вещей, включая тип exchange, который определяет ряд правил перемещения, ключей маршрутизации и атрибутов заголовков. Все они действуют как адреса для сообщений.
С точки зрения очереди вы можете проверить, какие exchange и правила маршрутизации связаны с этой конкретной очередью. Эти ссылки называются привязками. Привязка связывает очередь с exchange, в то время как ключ маршрутизации подобен адресу для сообщения. Это в основном то, что ищет exchange при принятии решения о том, как направить сообщение в очереди.
Типы exchange
В RabbitMQ существует четыре основных типа exchange:
- Direct
- Topic
- Fanout
- Headers
Существующие exchange и типы можно увидеть в интерфейсе управления или через rabbitmqadmin.
Пример таксомоторной компании
Мы будем использовать пример таксомоторной компании, чтобы объяснить различные типы exchange. Каждый запрос на такси выполняется через приложение, которое взаимодействует с прикладной службой, использующей RabbitMQ.
Direct
Прямой обмен направляет сообщение в определенную очередь, просматривая ключ маршрутизации. Ключ маршрутизации в сообщении сравнивается на предмет равенства с ключами маршрутизации в привязках. В нашем примере прямой обмен используется, когда пользователь запрашивает определенное такси, например, своего любимого водителя.
Topic
Exchange направляет сообщения в одну или несколько очередей, просматривая ключ маршрутизации. Ключ маршрутизации в сообщении сравнивается на предмет совпадений с шаблонами ключей маршрутизации в привязках.
В нашем примере клиент с группой друзей заказывает большое экологически чистое такси. Этот заказ направляется через обмен, привязанный к такси этого типа.
Ключ маршрутизации должен быть списком слов, разделенных точкой. Topic exchange поддерживает «строгое» сопоставление ключей маршрутизации, как и прямой обмен, но также будет выполнять сопоставление «подстановочных знаков», используя звездочку (*) и решетку (#) в качестве заполнителей.
В другом примере клиент заказывает большое такси, но его не волнует тип такси. Topic exchange направляет это сообщение всем такси, привязанным как большое такси.
Fanout
Fanout exchange копирует и направляет полученное сообщение всем очередям, привязанным к нему, независимо от ключей маршрутизации. Предоставленный ключ маршрутизации просто игнорируется. В нашем примере Fanout exchange используется, когда координаторы такси информируют всех водителей такси о заблокированной дороге.
Headers
Headers exchange очень похож на обмен темами, но маршрутизирует сообщения на основе значений заголовков, а не ключей маршрутизации. Обмен заголовками не очень распространен, но в нашем примере он используется службой отчетов в таксомоторной компании. Данные о состоянии такси время от времени отправляются на exchange, и эти данные используются для создания отчетов другими частями системы.
Специальный аргумент с именем "x-match", добавленный в привязку между exchange и очередью, указывает, должны ли заголовки соответствовать "all" или "any". В этом примере одна служба пишет отчет для всех такси вокруг Манхэттена, Нью-Йорк, отслеживая расход топлива и пройденные мили. Эти данные включаются в сообщение. Когда "x-match" установлен на "any", вместе со следующими аргументами, отчет по Нью-Йорку получает все сообщения от такси с поездками из, в или в пределах Нью-Йорка. Таким образом, поездка, которая начинается в Нью-Йорке и заканчивается в Джерси, будет включена.
Другой отчет может быть заинтересован в поездках только в пределах Нью-Йорка. Этого можно добиться, просто установив "x-match" на "all". Тогда новый отчет будет получать только сообщения, где "from" и "to" установлены на Нью-Йорк — поездки, которые никогда не покидают город.