RocketMQ的事务消息

本文主要介绍 MQ 事务的概念、适用场景以及使用过程中的注意事项。

概念介绍

事务消息:MQ 提供类似 X/Open XA 的分布事务功能,通过 MQ 事务消息

能达到分布式事务的最终一致。

半消息:暂不能投递的消息,发送方已经将消息成功发送到了 MQ 服务端,但是服务端未收到生产者对该消息的二次确认,此时该消息被标记成“暂不能投递”状态,处于该种状态下的消息即半消息。

消息回查:由于网络闪断、生产者应用重启等原因,导致某条事务消息的二次确认丢失,MQ 服务端通过扫描发现某条消息长期处于“半消息”时,需要主动向消息生产者询问该消息的最终状态(Commit 或是 Rollback),该过程即消息回查。

适用场景

MQ 事务消息适用于以下场景:

帮助用户实现类似 X/Open XA 的分布事务功能,通过 MQ 事务消息能达到分布式事务的最终一致。

使用方式

交互流程

MQ 事务消息交互流程如下所示:

640?wx_fmt=png

其中:

  1. 发送方向 MQ 服务端发送消息。

  2. MQ Server 将消息持久化成功之后,向发送方 ACK 确认消息已经发送成功,此时消息为半消息。

  3. 发送方开始执行本地事务逻辑。

  4. 发送方根据本地事务执行结果向 MQ Server 提交二次确认(Commit 或是 Rollback),MQ Server 收到 Commit 状态则将半消息标记为可投递,订阅方最终将收到该消息;MQ Server 收到 Rollback 状态则删除半消息,订阅方将不会接受该消息。

  5. 在断网或者是应用重启的特殊情况下,上述步骤4提交的二次确认最终未到达 MQ Server,经过固定时间后 MQ Server 将对该消息发起消息回查。

  6. 发送方收到消息回查后,需要检查对应消息的本地事务执行的最终结果。

  1. 发送方根据检查得到的本地事务的最终状态再次提交二次确认,MQ Server 仍按照步骤4对半消息进行操作。

事务消息发送对应步骤1、2、3、4,事务消息回查对应步骤5、6、7。

注意事项

  1. 事务消息的 Producer ID 不能与其他类型消息的 Producer ID 共用。与其他类型的消息不同,事务消息有回查机制,回查时MQ Server会根据Producer ID去查询客户端。

  2. 通过 ONSFactory.createTransactionProducer 创建事务消息的 Producer 时必须指定 LocalTransactionChecker 的实现类,处理异常情况下事务消息的回查。

  3. 事务消息发送完成本地事务后,可在 execute 方法中返回以下三种状态:

TransactionStatus.CommitTransaction 提交事务,允许订阅方消费该消息。

TransactionStatus.RollbackTransaction 回滚事务,消息将被丢弃不允许消费。

TransactionStatus.Unknow 暂时无法判断状态,期待固定时间以后 MQ Server 向发送方进行消息回查。

可通过以下方式给每条消息设定第一次消息回查的最快时间:

640?wx_fmt=jpeg

版权申明:内容来源网络,版权归原创者所有。如有侵权烦请告知,我们会尽快删除并表示歉意。谢谢。原文链接:https://help.aliyun.com/document_detail/43348.html?spm=a2c4g.11186623.6.564.VsL2s5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值