Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Транзакции AMQP
Транзакция AMQP 1.0 объявляется у координатора брокера, и передачи, отправленные в ней, доходят до своих узлов вместе при фиксации или не доходят вовсе.
Схема текстом
- declare по управляющей связи → declared txn-id координатора: координатор
- declared txn-id координатора → передачи по отправляющим связям с txn-id: txn-id
- передачи по отправляющим связям с txn-id → discharge fail=false фиксация
- discharge fail=false фиксация → accepted: сообщения доходят до узлов вместе: accepted
- передачи по отправляющим связям с txn-id → discharge fail=true: откат, ничего не доставлено: или
- До 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).