Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Адреса
Адрес называет узел брокера. Возможность узла, которую запрашивает получатель, решает, делят ли получатели адреса одну очередь или каждый получает свою копию.
Схема текстом
- Адрес orders: anycast: Очередь orders каждое сообщение один раз
- Адрес events: multicast: Очередь подписки получателя 1; Очередь подписки получателя 2
- Динамический источник: Получатель dynamic = true; Временная очередь с именем от брокера
- Очередь orders каждое сообщение один раз → Получатель 1 возможность queue: сообщение 1
- Очередь orders каждое сообщение один раз → Получатель 2 возможность queue: сообщение 2
- Очередь подписки получателя 1 → Получатель 1 возможность topic: каждое сообщение
- Очередь подписки получателя 2 → Получатель 2 возможность topic: каждое сообщение
- Получатель dynamic = true → Временная очередь с именем от брокера: attach
- Временная очередь с именем от брокера → Получатель 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, модель адресов).