基于消息队列实现分布式事务

场景:

订单系统产生订单,购物车系统减购物车中的商。

实现思路 :

基于消息队列实现分布式事务-LMLPHP

基于消息队列实现分布式事务-LMLPHP

问题:

如何解決消息队列事务提交过程出现的异常:

kafka会直接抛出异常用户自行处理;

在RocketMQ中的事务实现中,增加了事务反查的机制来解决事务消息提交失败的问题 , RocketMQ的Broker没有收到提交或者回滚的请求,Broker会定期去producer上反查这个事务对应的本地事务的状态,然后根据反查结果决定提交或者回滚这个事务。

为了支持事务反查机制,我们的业务代码需要实现一个反查本地事务状态的接口告知RocketMQ本地事务是成功还是失败。

本例中的反查逻辑很简单只需根据消息中的订单ID,在订单库中查询订单是否存在即可。

能不能在订单创建完成后再向消息队列发送订单数据?这样不用考虑订单创建失败而发送消息的情况了

考虑这样一种情况:订单创建成功了,还没来得及发消息,这个节点突然断电了。

还有一种情况订单创建成功,减购物车(后续操作)失败的话要写实物补偿把创建的订单删掉。

能不能这样:

1.开启本地事务创建订单,2.发消息,3.根据发消息是否成功来决定提交还是回滚本地事务。这样不需要事务消息也能解决这个场景的问题了?

如果本地事务提交失败已发送的消息无法撤回,会导致数据不一致。

基于消息队列实现分布式事务-LMLPHP

小结

不论是消息队列事务还是异步事务都遵循事务的四大特性:原子性,一致性,隔离性,持久性。

更多实现分布式事务的方法: https://blog.csdn.net/ityqing/article/details/102655827


**** 码字不易如果对你有帮助请给个关注****

**** 爱技术爱生活 QQ群: 894109590****

11-13 22:09