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

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

Транзакции AMQP

Транзакция AMQP 1.0 объявляется у координатора брокера, и передачи, отправленные в ней, доходят до своих узлов вместе при фиксации или не доходят вовсе.

Транзакционная отправка: declare у координатора, отправка под txn-id и discharge для фиксации или откатаdeclareпо управляющей связиdeclaredtxn-id координаторапередачи по отправляющимсвязям с txn-iddischarge fail=falseфиксацияaccepted:сообщения доходятдо узлов вместеdischargefail=true:откат,ничего недоставленоДо discharge ни один потребитель не видитсообщения, отправленного в транзакции
Схема текстом
  1. declare по управляющей связи → declared txn-id координатора: координатор
  2. declared txn-id координатора → передачи по отправляющим связям с txn-id: txn-id
  3. передачи по отправляющим связям с txn-id → discharge fail=false фиксация
  4. discharge fail=false фиксация → accepted: сообщения доходят до узлов вместе: accepted
  5. передачи по отправляющим связям с txn-id → discharge fail=true: откат, ничего не доставлено: или
  6. До discharge ни один потребитель не видит сообщения, отправленного в транзакции

Координатор - это узел брокера. К нему присоединяется управляющая связь (controller) и отправляет declare, а координатор отвечает идентификатором транзакции. Затем передача по любой обычной отправляющей связи указывает этот идентификатор в своём транзакционном состоянии. discharge завершает транзакцию: с fail false она фиксируется, с fail true откатывается.

AmqpTxnPublisher отправляет сообщения в транзакции. Каждый вызов begin_transaction присоединяет управляющую связь на сеансе издателей соединения и объявляет одну транзакцию, а commit и abort её завершают. Управляющая связь запрашивает режим урегулирования отправителя mixed, потому что Artemis отвечает этим режимом, а клиент требует, чтобы брокер повторил запрошенный режим.

Здесь брокеры различаются. Artemis обслуживает одну транзакцию на сеанс, а издатели одного соединения делят один сеанс. RabbitMQ 4 не поддерживает транзакции AMQP 1.0. Azure Service Bus их поддерживает и отправляет сообщения в несколько сущностей в одной транзакции через сущность send-via.

Протокол описан в спецификации (транзакции), а ограничения брокеров - у каждого поставщика (Artemis, RabbitMQ, Service Bus).