分布式事务解决方案"/>
【吊打面试,击中要害】分布式事务解决方案
阅读文本大概需要10分钟。
分布式事务解决方案有很多种,最要包括基于XA协议的两阶段提交方案、本地消息表方案、TCC事务补偿型方案、可靠消息最终一致性方案、尽最大努力通知型方案等。面试的时候不可能长篇大论,所以能答上下面这三种方案就七八不离十。
0x01:TCC事务补偿型
TCC的全程主要包括Try(尝试)、Confirm(确认)、Cancel(取消)这三个主要阶段。
Try阶段:这个阶段是对各个微服务的资源做检测以及对资源进行锁定或者预留
Confirm阶段:这个阶段主要是在各个微服务中执行实际的业务操作
Cancel阶段:如果任何一个微服务的业务方法执行出现错误,那么这里就需要进行补偿,就是执行已经执行成功的业务逻辑的进行回滚操作。
TCC方案很少用人使用,因为事务回滚操作实际上是严重依赖于手动编写代码来进行回滚和补偿操作,这样的话就会造成补偿代码过多,使得项目非常难以维护。比较适合的场景就是除非真的一致性要求非常高,是系统中的核心业务场景,例如常见的就是资金类的场景,那可以用TCC方案。
0x02:可靠消息最终一致性方案
可靠消息最终一致性方案的主要思路如下:
A系统首先发送一个prepared消息到消息服务mq,如果这个prepared消息发送失败,那么就直接取消操作,不再进行任何操作执行了。
如果这个消息发送成功过了,那么接着执行本地事务,如果成功就告诉消息服务mq发送确认消息,如果失败就告诉消息服务mq回滚消息
如果发送了确认消息,那么此时B系统会接收到确认消息,然后执行本地的事务
消息服务mq会自动定时轮询所有prepared消息回调相应服务接口,询问这个消息是不是本地事务处理失败了,所以没发送确认消息?是继续重试还是回滚?一般来说可以查下数据库查看之前的本地事务是否执行,如果回滚了,那么这里也回滚吧。这个就是避免可能本地事务执行成功了,而确认消息发送失败了。
可靠消息最终一致性方案里要是系统B的事务失败了怎么办?重试咯,自动不断重试直到成功,如果实在是不行,要么就是针对重要的资金类业务进行回滚,比如B系统本地回滚后,想办法通知系统A也回滚;或者是发送报警由人工来手工回滚和补偿。
可靠消息最终一致性方案使用场景比较广泛,适合于对实时性要求不高、比较耗时的应用场景。通过消息中间件做成异步调用,发送一个消息出去,人家服务消费消息来执行业务逻辑。可用RocketMQ的分布式事务实现可靠消息最终一致性方案(RocketMQ = 可靠消息服务+MQ)。
0x03:最大努力通知方案
最大努力通知方案的主要思路如下:
系统A本地事务执行完毕之后,发送个消息到消息服务MQ
这里会有个专门消费消息服务MQ的最大努力通知服务,该服务会消费消息服务MQ,然后写入数据库中记录下来或者是放入个内存队列,接下来调用系统B的接口
要是系统B执行成功就ok了;要是系统B执行失败了,那么最大努力通知服务就定时尝试重新调用系统B,反复N次,最后还是失败就放弃。
最大努力通知方案适合跨平台的业务活动,例如商户通知,允许多次通知、支持查询校对、定期对账。
注:图片来源网络,如有侵权联系删除。
面试不需要长篇大论,但是需要击中要害。
☆
往期精彩
☆
01 【吊打面试,击中要害】缓存穿透、缓存击穿和缓存雪崩
02 Linux的常用最危险的命令
03 精讲Spring Boot—入门+进阶+实例
04 优秀的Java程序员必须了解的GC哪些
05 互联网支付系统整体架构详解
关注我
每天进步一点点
喜欢!在看☟
更多推荐
【吊打面试,击中要害】分布式事务解决方案
发布评论