一 序
本文属于奈学教育rocketmq学习笔记。主讲老师陈东。
这节课听了半截,后来的pdf也找不到了。
业务场景
1、用户下单
1)创建订单+减库存
2、发布或更新商品信息
1)写商品库+更新外置索引
二 事务消息实现原理
2.1分布式事务
1、强一致
1)一致性协议
2、两阶段提交2PC
3、三阶段提交3PC
4、落地方案 => XA规范
1)资源管理器=> 事务参与者
2)事务管理器=> 事务协调者
5、柔性事务
1)最终一致性方案
2)TCC(Try-Confirm-Cancel)
3)SAGA 模型
a:一个分布式事务拆分为多个本地事务
b:本地事务都有相应的执行模块和补偿模块
c:事务管理器负责在事务失败时调度执行补偿逻辑
上面的网上很多文章,就不展开了。
6、事务消息
1)简化了分布式事务模型
2)对业务友好
相当于=RPC+事务消息
三 事务消息机制
两阶段提交
a: 发送半消息
b:执行本地事务
c:发送Commit/Rollback
d:提供回查接口
四、事务消息原理
1、半消息主题
1)HALF 消息:RMQ_SYS_TRANS_HALF_TOPIC(临时存放消息信息)
a: 事务消息替换主题,保存原主题和队列信息
b:半消息对Consumer不可见,不会被投递
2)OP 消息:RMQ_SYS_TRANS_OP_HALF_TOPIC(记录二阶段操作)
a:Rollback:只做记录
b:Commit:根据备份信息重新构造消息并投递
3)回查
a:对比HALF消息和OP消息进行回查
RocketMq事务消息是保证事务的最终一致性,从上面的介绍可以看到,半消息标记为“暂时不能投递”的状态,是特殊的队列。
消息回查,由于某些特殊原因,如网络抖动,生产者应用重启,可能导致某条消息的二次确认丢失,而broker会不定时的扫描某条长期处于半消息状态的消息,此时会主动向生产者发送询问该条消息的最终状态,(commit或者rollBack),即对该消息进行回查,这个是broker自动为我们做的,默认时间间隔是1分钟。
4) 缺点
需要业务方提供回查接口,对业务侵入较大。
这里老师讲了一个实现方式:
1)通过客户端实现
2)事务消息表记录发消息事件
3)本地事务保证业务数据与写消息表原子性
4)事务管理器维护事务消息表
扫库发送、清理。