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

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

Адреса

Адрес называет узел брокера. Возможность узла, которую запрашивает получатель, решает, делят ли получатели адреса одну очередь или каждый получает свою копию.

Три способа, которыми получатели работают с адресом: конкуренция за одну очередь, своя очередь подписки у каждого и узел, который создаёт брокерАдрес orders: anycastАдрес events: multicastДинамический источникОчередь ordersкаждое сообщение один разПолучатель 1возможность queueПолучатель 2возможность queueОчередь подпискиполучателя 1Очередь подпискиполучателя 2Получатель 1возможность topicПолучатель 2возможность topicПолучательdynamic = trueВременная очередьс именем от брокера
Схема текстом
  1. Адрес orders: anycast: Очередь orders каждое сообщение один раз
  2. Адрес events: multicast: Очередь подписки получателя 1; Очередь подписки получателя 2
  3. Динамический источник: Получатель dynamic = true; Временная очередь с именем от брокера
  4. Очередь orders каждое сообщение один раз → Получатель 1 возможность queue: сообщение 1
  5. Очередь orders каждое сообщение один раз → Получатель 2 возможность queue: сообщение 2
  6. Очередь подписки получателя 1 → Получатель 1 возможность topic: каждое сообщение
  7. Очередь подписки получателя 2 → Получатель 2 возможность topic: каждое сообщение
  8. Получатель dynamic = true → Временная очередь с именем от брокера: attach
  9. Временная очередь с именем от брокера → Получатель dynamic = true: адрес

Получатель присоединяется с терминусом-источником: адресом узла и списком возможностей (capabilities), которые получатель ждёт от узла. AmqpAddress::queue запрашивает возможность queue, AmqpAddress::topic - возможность topic, а AmqpAddress::raw не запрашивает никакой.

ActiveMQ Artemis читает запрошенную возможность. С queue получатели адреса присоединяются к одной очереди anycast и конкурируют: каждое сообщение достаётся одному из них. С topic адрес становится multicast, и Artemis даёт каждому получателю собственную очередь подписки, поэтому каждый получает все сообщения. Artemis создаёт адрес и его очереди при первом присоединении, если его настройки это не запрещают, а orders::billing напрямую называет одну очередь адреса.

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

Адрес raw доходит до брокера ровно в том виде, в каком написан, и что он значит, решает собственная конфигурация брокера. Другие брокеры адресуют свои узлы по-своему. RabbitMQ 4 называет очередь /queues/orders, а обменник - /exchanges/events/key, и очередь должна существовать заранее. Azure Service Bus называет очередь её именем, а подписку на тему - events/subscriptions/billing.

Вместо имени источника получатель может запросить динамический источник. Тогда брокер создаёт узел (Artemis - временную очередь) и возвращает его адрес в ответе на присоединение. request присоединяет такого получателя на каждый запрос, отправляет его адрес в reply-to и отсоединяет получателя, когда пришёл ответ или истёк тайм-аут.

Поля терминуса взяты из спецификации (обмен сообщениями, раздел 3.5), а модель адресов - из Artemis (AMQP, модель адресов).