RocketMQ分布式事物设计思想
在我前一篇文章分布式事物中提到了RocketMQ的分布式事物解决方案,其中关于生产者如何保证COMMIT-MESSAGE发送给消息中间件。那么这篇文章我们就来探究其实现。
RocketMQ分布式事物设计
先上图吧,比较直观,方便我们去理解。
此图我们就按照一个经典的银行转账的业务来做例子
上图就是RocketMQ分布式事物实现的时序图。
从时序图中大家肯定会有个疑问:5如何保证MQ发送成功呢?这个是分布式事物实现的一个关键点所在
查资料说3.2.6之前的版本是有一个事物回查机制保证本地事物执行后发送确认信息被消息中间件接收到。
但是此版本之后这个接口被干掉了,不会再进行事物回查操作,那么第5步骤操作会存在如下情况:
1.本地事物成功后宕机,确认消息没有发出,分布式事物只执行一般该如何是好?
2.确认消息发出,单因为网络抖动等原因RocketMQ集群没有接收到?
3.确认消息发出,RocketMQ集群接收到了,但是新版本取消回查机制后,生产者如何知道确认消息发出是否成功
以上三个问题新版本是如何解决的呢?
解决办法
话不多说还是上图,比较直观理解
一、在执行本地事物commit前向回查表插入消息KEY值
二、在生产者集群上设置一个定时任务
利用回查表中的confirm和count值来确认信息是否成功发送
1.发送失败的confirm=0,count=阈值说明COMMIT_MESSAGE没有发送成功,需要重新发送
2.发送成功的,但是没有收到ACK的信息,进行回查sysFlag=8,然后更新回查表状态
这样基于这种回查表的设计,来保证消息中间件能够收到确认消息和生产者能够知道消息确认发送成功。