RocketMQ 的事务消息是如何实现的?
用户问题 :
RocketMQ 的事务消息是如何实现的?
专家官方解答 :
RocketMQ 的事务消息实现
RocketMQ的事务消息设计主要基于两阶段提交(2PC)的思想,通过增加一个补偿逻辑来处理二阶段超时或者失败的消息。下面将结合我了解的信息中的信息具体说明。
1. 事务消息发送及提交流程
根据提供的我了解的信息,事务消息的发送和提交过程可以分为两个阶段:
-
第一阶段:
- 发送half消息。
- 服务端响应消息写入结果。
- 根据发送结果执行本地事务(如果写入失败,half消息对业务不可见,本地逻辑不执行)。
- 根据本地事务状态执行Commit或Rollback操作(Commit操作生成消息索引,使得消息对消费者可见)。
-
第二阶段:针对未确定状态的消息,从服务端发起一次“回查”,Producer收到回查消息后检查对应本地事务的状态,并根据本地事务状态重新执行Commit或Rollback操作。
2. 实现机制
-
Half消息的存储:在一阶段,为了保证half消息对用户不可见,RocketMQ会修改消息的主题为一个特定值(如RMQ_SYS_TRANS_HALF_TOPIC),并保存原始主题和队列信息于消息属性中。由于消费组未订阅该特定主题,因此这些消息不会被消费。同时,RocketMQ启动定时任务从这个特殊Topic中拉取消息进行状态查询。
-
Op消息的引入:在完成一阶段写入一条对用户不可见的消息后,对于二阶段的操作,无论是Commit还是Rollback,RocketMQ都会记录一个Op操作,用来标识事务消息已经确定的状态。如果一条事务消息没有对应的Op消息,则说明这个事务的状态还无法确定。
-
补偿机制:当二阶段操作遇到网络问题或其他原因导致失败时,RocketMQ采用了一种称为“回查”的补偿机制。Broker端会对未确定状态的消息发起回查,将消息发送到对应的Producer端,由Producer检查本地事务状态进而执行相应的Commit或Rollback操作。值得注意的是,默认情况下,RocketMQ会在尝试回查15次仍未能得知事务状态时自动回滚该消息。
3. 关键点总结
- 半事务消息的隔离:通过更改主题确保一阶段的消息暂时对外部不可见。
- Op消息用于追踪事务状态:提供了一个额外的机制来跟踪事务消息的确切状态。
- 定期回查机制:保证即使在网络不稳定的情况下也能尽可能地保证最终一致性。
以上就是RocketMQ事务消息实现的基本原理与关键步骤,希望对你有所帮助!更多关于RocketMQ的具体配置及最佳实践可参考官方文档: Apache RocketMQ 官方文档。
---------------
参考链接 :
-
专家经验:rocketmq 设计(design)
-
专家经验:事务消息
-
专家经验:rocketMQ的基本概念
---------------
答疑服务说明:
本内容经由技术专家审阅的用户问答的镜像生成,我们提供了专家智能答疑服务,使用方法: 用法1: 在页面的右下的浮窗”专家答疑“。 用法2: 点击专家答疑页(针对部分网站不支持插件嵌入的情况)
另:
有其他开源产品的使用问题?点击访问阿里AI专家答疑服务。
反馈
如问答有错漏,欢迎点:差评给我们反馈。