会员登录 - 用户注册 - 设为首页 - 加入收藏 - 网站地图 谈谈你对RocketMQ分布式事务原理的理解!

谈谈你对RocketMQ分布式事务原理的理解

时间:2025-11-05 08:46:14 来源:益强数据堂 作者:系统运维 阅读:487次

​有位工作五年的谈谈小伙伴在面试的时候被问到RocketMQ的分布式事务实现原理。他说他只知道RocketMQ能够支持事务,对R的理但是布式没有了解过它的事务实现原理。

今天,事务我给大家分享一下我对这个问题的原理理解。

1.分布式事务应用场景

随着应用的谈谈拆分,从单体架构变成分布式架构,对R的理那么每个服务或者模块也会有自己的布式数据库。一个业务流程的事务完成需要经过多次的接口调用或者多条MQ消息的发送。

浪漫和悲观并不冲突,原理我时常消极但又依旧觉得生活很美好,谈谈哪怕只是对R的理一束光照进了房间,也要认真对待它的布式到来。

那么问题来了,事务如果是原理执行多条SQL语句,数据库的本地事务可以保证原子性。亿华云

浪漫和悲观并不冲突,我时常消极但又依旧觉得生活很美好,哪怕只是一束光照进了房间,也要认真对待它的到来。

但,如果是一条SQL操作,再加一条MQ的操作,如何才能把它们两个放在同一个逻辑单元里面执行呢?是先执行SQL还是先发送MQ呢?

浪漫和悲观并不冲突,我时常消极但又依旧觉得生活很美好,哪怕只是一束光照进了房间,也要认真对待它的到来。

我们来分析一下情况,如果是先发送MQ消息,再执行SQL。这个时候就要分为两种情况:

第1种情况:如果发送MQ失败了,当然SQL也就不会执行了。

第2种情况:如果发送MQ成功了,而本地数据库SQL执行失败。比如出现了网络异常,主键重复或者字段超长等等。

浪漫和悲观并不冲突,我时常消极但又依旧觉得生活很美好,哪怕只是一束光照进了房间,源码下载也要认真对待它的到来。

也就是说,下游的业务系统拿到了最新的数据,而自己本地的数据库反而没有。这个时候,本地数据库的数据跟其他系统已经登记的数据就不一样了,而发出去的消息又不可能撤回,有可能已经被消费了,这个叫做覆水难收。

浪漫和悲观并不冲突,我时常消极但又依旧觉得生活很美好,哪怕只是一束光照进了房间,也要认真对待它的到来。

因此,在分布式应用场景中,我们需要调整一下代码执行流程,也就是说必须先操作本地数据库,再发送MQ消息。如果本地数据库SQL执行成功,就算MQ消息发送失败,MQ还可以重发。

2.分布式事务实现原理

那基于上面的网站模板应用场景,应该如何设计发送消息的流程,才能让这两个操作要么都成功,要么都失败呢?

其实,可以参照XA两阶段提交的思想,把发送消息分成两步,然后把操作本地数据库也包括在这个流程中。那么,在介绍原理之前,先科普一下两个新的概念:

1、半消息(Half Message):也就是暂不能投递消费者的消息。发送方已经将消息成功发送到了 MQ 服务端,但是服务端未收到生产者对这条消息的二次确认,这个时候,这条消息会被标记为“暂不能投递”状态。

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

下面给大家介绍一下RocketMQ的分布式事务实现原理,如图所示,一共分为七个步骤:

浪漫和悲观并不冲突,我时常消极但又依旧觉得生活很美好,哪怕只是一束光照进了房间,也要认真对待它的到来。

第一步:生产者向 MQ 服务端发送消息。

第二步:MQ 服务端将消息持久化成功之后,向发送方 ACK 确认消息已经发送成功,此时消息为半消息。

第三步:发送方开始执行本地数据库事务逻辑。

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

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

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

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

好了,以上就是我对RocketMQ分布式事务的理解。

(责任编辑:数据库)

推荐内容
  • 解决电脑关机显示脚本页码错误的方法(修复脚本页码错误,让电脑正常关机)
  • Win8操作系统使用教程(轻松掌握Win8的关键技巧与功能)
  • 华硕电脑PE装系统详细教程(华硕电脑PE装系统全面指南)
  • 华硕X555YI7310性能评测(一览华硕X555YI7310的强大性能和出色性价比)
  • 电脑更新CF错误代码的解决方法(掌握解决CF错误代码的技巧,让游戏畅快进行)
  • U小白盘安装系统教程(从零开始,手把手教你安装系统,让U小白也能轻松上手!)