Java-Interview-Advanced/docs/distributed-system/rocketmq-transaction.md

41 lines
2.4 KiB
Markdown
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

类似TCC事务的落地的一些东西技术选型业务场景需要分布式事务结合我个人亲身经历的一个创业公司APP的一个事故给大家介绍了一下对于系统核心链路为什么必须要上分布式事务
seatagithub上都会提供sample跟dubbo官方的同学是定义为doublespring cloudseata都提供了sample知道如何把分布式事务框架整合到框架里去了
![核心交易链路](/docs/distributed-system/images/rocketmq-transaction.png)
核心交易链路,分布式事务框架
有些服务之间的调用是走异步的下成功了订单之后你会通知一个wms服务去发货这个过程可以是异步的可以是走一个MQ的发送一个消息到MQ里去由wms服务去从MQ里消费消息
MQ消息中间件面试突击第一季刚开头我就讲过消息中间件的面试连环炮
可靠消息最终一致性方案,参考面试突击第一季
落地RocketMQ来实现可靠消息最终一致性事务方案
Producer向RocketMQ发送一个half message
RocketMQ返回一个half message success的响应给Producer这个时候就形成了一个half message了此时这个message是不能被消费的
注意这个步骤可能会因为网络等原因失败可能你没收到RocketMQ返回的响应那么就需要重试发送half message直到一个half message成功建立为止
接着Producer本地执行数据库操作
Producer根据本地数据库操作的结果发送commit/rollback给RocketMQ如果本地数据库执行成功那么就发送一个commit给RocketMQ让他把消息变为可以被消费的如果本地数据库执行失败那么就发送一个rollback给RocketMQ废弃之前的message
注意这个步骤可能失败就是Producer可能因为网络原因没成功发送commit/rollback给RocketMQ此时RocketMQ自己过一段时间发现一直没收到message的commit/rollback就回调你服务提供的一个接口
此时在这个接口里你需要自己去检查之前执行的本地数据库操作是否成功了然后返回commit/rollback给RocketMQ
只要message被commit了此时下游的服务就可以消费到这个消息此时还需要结合ack机制下游消费必须是消费成功了返回ack给RocketMQ才可以认为是成功了否则一旦失败没有ack则必须让RocketMQ重新投递message给其他consumer