分布式事务解决方案之基于RocketMQ

本文不仔细讲,详细的网上都有,画个流程图可以帮助理解一下

分布式事务解决方案之基于RocketMQ_第1张图片

 

 

 

参考石杉的架构笔记

 

分布式事务解决方案之基于RocketMQ_第2张图片

 

我们来解释一下这个方案的大概流程:

  1. A系统先发送一个prepared消息到mq,如果这个prepared消息发送失败那么就直接取消操作别执行了,后续操作都不再执行

  2. 如果这个消息发送成功过了,那么接着执行A系统的本地事务,如果执行失败就告诉mq回滚消息,后续操作都不再执行

  3. 如果A系统本地事务执行成功,就告诉mq发送确认消息

  4. 那如果A系统迟迟不发送确认消息呢?

    此时mq会自动定时轮询所有prepared消息,然后调用A系统事先提供的接口,通过这个接口反查A系统的上次本地事务是否执行成功

    如果成功,就发送确认消息给mq;失败则告诉mq回滚消息(后续操作都不再执行)

  5. 此时B系统会接收到确认消息,然后执行本地的事务,如果本地事务执行成功则事务正常完成

  6. 如果系统B的本地事务执行失败了咋办?

    基于mq重试咯,mq会自动不断重试直到成功,如果实在是不行,可以发送报警由人工来手工回滚和补偿

这种方案的要点就是可以基于mq来进行不断重试,最终一定会执行成功的。

因为一般执行失败的原因是网络抖动或者数据库瞬间负载太高,都是暂时性问题。

通过这种方案,99.9%的情况都是可以保证数据最终一致性的,剩下的0.1%出问题的时候,就人工修复数据呗。

适用场景:

这个方案的使用还是比较广,目前国内互联网公司大都是基于这种思路玩儿的。

官方springboot rocketmq例子:https://github.com/ThierrySquirrel/rocketmq-spring-boot-starter

你可能感兴趣的:(Spring,分布式,java,分布式事务,rocketmq)