事务消息介绍
rocketMq在4.x版本里面的事务消息功能似乎不是完整的,在阅读的源码过程中发现只有其实宏观上看可以区分为两个阶段
阶段一:prepare阶段,该阶段主要发一个消息到rocketMq,但是该消息只存储在commitLog当中,在consumeQueue中不可见。
阶段二:commit/rollback阶段,该阶段主要是在commit阶段重新生成一个message(prepare阶段消息的克隆),保存到commitLog当中,同时会将该消息保存至consumeQueue当中。
事务消息举例
![img_b8ae63c6be619fa8b22e806fdff08824.png](https://i-blog.csdnimg.cn/blog_migrate/83fe13e01ffcd451e01a6dcfbfd6620d.png)
![img_d3c5e677e67799f99d046c0f82442032.png](https://i-blog.csdnimg.cn/blog_migrate/47745c1761794e0bd968136f4ca034b0.png)
说明:
1、先发送prepared消息,也就是步骤1中的发送转账消息
2、执行本地操作,也就是步骤4中的本地事务
3、发送commit消息,也就是步骤中5中的发送确认消息
rocketMq的交互流程
![img_7f9b3e874c2c6865216919b46ffe2701.png](https://i-blog.csdnimg.cn/blog_migrate/c399b44be3e46f610e9f45722b6d7d5e.png)
说明:
1、参考阿里云的消息队列截图
事务消息的producer
![img_4391fc97556c526c0dadc616dfbe25cb.png](https://i-blog.csdnimg.cn/blog_migrate/148aa06bcd5ba651ed7fe6971f9ca752.png)
说明:
1、分布式事务producer多了两个东西,本地事务执行函数,提供给远程回调的回调函数(基本没用)。
事务消息的prepare阶段
![img_01bd5d00eb962522a11f80c5d82151cb.png](https://i-blog.csdnimg.cn/blog_migrate/58ea7c442869a716431c1b40e4596368.png)
说明:参见DefaultMQProducerImpl类
![img_e37876122bfec1f72c81167167cf085f.png](https://i-blog.csdnimg.cn/blog_migrate/fa01efff6e4b6f774523e8f855dd1971.png)
说明:参见DefaultMessageStore类
1、prepare消息不回拷贝至consumeQueue,也就是消息不可见。
事务消息的commit阶段
![img_ac96db1ac23781b1b79a7dc09535bc09.png](https://i-blog.csdnimg.cn/blog_migrate/5c96ef73deb5a7b1bf9808dc79aabf6c.png)
说明:参见EndTransactionProcessor类。
1、EndTransactionProcessor是事务消息commit的入口
![img_c03f65faa68102eb3a47adbb11809327.png](https://i-blog.csdnimg.cn/blog_migrate/6250fc4fb2263f84d8611691b50453b1.png)
说明:参见DefaultMessageStore类
1、rocketMq在消费commit的事务消息的时候会放置到consumeQueu当中
2、放置到consumeQueue以后就可以被消费了