跳到主要内容
英文版本为准

本页译自英文,由模型翻译。若与英文原文存在差异,以英文原文为准。

AMQP 事务

AMQP 1.0 事务在 Broker 的协调器上声明,在其下发布的 transfer 要么在提交时一起到达各自的节点,要么都不到达。

事务性发布:在协调器上声明,带 txn-id 发布,再用 discharge 提交或回滚declare在控制器链路上declared协调器的 txn-id发送链路上的 transfer带着 txn-iddischarge fail=false提交accepted:消息一起到达各自的节点dischargefail=true:回滚,什么也不投递discharge 之前,没有消费者能看到在事务中发布的消息
以文字阅读本图
  1. declare 在控制器链路上 → declared 协调器的 txn-id: 协调器
  2. declared 协调器的 txn-id → 发送链路上的 transfer 带着 txn-id: txn-id
  3. 发送链路上的 transfer 带着 txn-id → discharge fail=false 提交
  4. discharge fail=false 提交 → accepted: 消息一起到达 各自的节点: accepted
  5. 发送链路上的 transfer 带着 txn-id → discharge fail=true: 回滚, 什么也不 投递: 或
  6. discharge 之前,没有消费者能看到 在事务中发布的消息

协调器是 Broker 的一个节点。控制器链路附加到它并发送 declare,协调器用一个事务 id 应答。此后,任何普通发送链路上的 transfer 都在其事务状态中带上这个 id。discharge 结束事务:fail 为 false 时提交,fail 为 true 时回滚。

AmqpTxnPublisher 在事务中发布消息。每次 begin_transaction 在连接的发布者会话上附加一条控制器链路并声明一个事务,commit 和 abort 对它执行 discharge。控制器请求 mixed 发送者结算模式,因为 Artemis 以这种模式应答,而客户端要求 Broker 原样回显它所请求的模式。

各 Broker 在这里有所不同。Artemis 每个会话只服务一个事务,而一个连接的发布者共用一个会话。RabbitMQ 4 不支持 AMQP 1.0 事务。Azure Service Bus 支持它们,并通过 send-via 实体在一个事务中向多个实体发布消息。

协议来自规范(事务),各 Broker 的限制来自各自厂商的文档(Artemis、RabbitMQ、Service Bus)。