分布式消息队列RocketMQ
四、 RocketMQ应用
4.4)事务消息
4.4.1) XA模式三剑客
4.4.1.1)XA协议
XA(Unix Transaction)是一种分布式事务解决方案,一种分布式事务处理模式,是基于XA协议的。
XA协议由Tuxedo(Transaction for Unix has been Extended for Distributed Operation,分布式操作扩展之后的Unix事务系统)首先提出的,并交给X/Open组织,作为资源管理器与事务管理器的接口标准。
XA模式中有三个重要组件:TC、TM、RM。
4.4.1.2)TC
Transaction Coordinator,事务协调者;维护全局和分支事务的状态,驱动全局事务提交或回滚。
RocketMQ中Broker充当着TC
4.4.1.3)TM
Transaction Manager,事务管理器;定义全局事务的范围:开始全局事务、提交或回滚全局事务,它实际是全局事务的发起者。
RocketMQ中事务消息的Producer充当着TM
4.4.1.4)RM
Resource Manager,资源管理器;管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
RocketMQ中事务消息的Producer及Broker均是RM
4.4.2)XA模式架构
XA模式是一个典型的2PC,其执行原理如下:
-
TM向TC发起指令,开启一个全局事务
-
根据业务要求,各个RM会逐个向TC注册分支事务,然后TC会逐个向RM发出预执行指令
-
各个RM在接收到指令后会在进行本地事务预执行
-
RM将预执行结果Report给TC。当然,这个结果可能是成功,也可能是失败
-
TC在接收到各个RM的Report后会将汇总结果上报给TM,根据汇总结果TM会向TC发出确认指令。
若所有结果都是成功响应,则向TC发送Global Commit指令
只要有结果是失败响应,则向TC发送Global Rollback指令
-
TC在接收到指令后再次向RM发送确认指令
事务消息方案并不是一个典型的XA模式;因为XA模式中的分支事务是异步的,而事务消息方案 中的消息预提交与预扣款操作间是同步的。
4.4.3)问题引入
这里的一个需求场景是:工行用户A向建行用户B转账1万元,处理流程如下图:
可以使用同步消息来处理该需求场景:
-
工行系统发送一个给B增款1万元的同步消息M给Broker
-
消息被Broker成功接收后,向工行系统发送成功ACK
-
工行系统收到成功ACK后从用户A中扣款1万元
-
建行系统从Br