开发者学堂课程【全面讲解Spring Cloud Alibaba技术栈(知识精讲+项目实战)第五阶段:分布式事务解决方案-最大努力通知】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/687/detail/11925
分布式事务解决方案-最大努力通知
内容介绍
一、基本介绍
二、基本原理
三、优缺点分析
一、基本介绍
现在学习第三种分布式事务解决方案为最大努力通知,也习惯于对其
称作定期校对。
这种方案其实是对基于可靠消息中间件的一种优化。在第二种解决方
案的基础之上引入了一个本地消息表,来记录由A系统投递消息到
中间件时未能成功投递的消息。此外又引入了一个失败消息表记录消
息中间件向B系统投递时投递失败的消息。
又引入了一个定期校对者,对失败消息进行自行的消费。但是在这样
的一个方案中有很多零碎的事物,比如本地消息表和失败消息表,而
且这些事物会与业务相偶合,并没有一个成型的方案能够解决它。这
就需要开发很多的代码,因此导致这种方案在业界并不是特别流行。
对其只要简单地了解原理即可。
二、基本原理
对此首先也是分成两个部分来了解。前面观察如何将消息由A系统
投递到中间件,后面观察如何由消息中间件发送到B系统。
1、消息由系统A投递到中间件
(1)处理业务的同一事务中,向本地消息表中写入一条记录。
这句话的意思就是一定保证的是业务处理和记录本地消息表是同时
成功,同时失败的。本地消息表中一旦有了数据就代表业务一定是成
功的。
(2)准备专门的消息发送者不断地发送本地消息表中的消息到消息中
间件,并且会等待消息中间件的一个应答,如果发送失败则重试。
一旦发现应答成功,会相应地对本地消息表作出处理。比如加上标识
或者进行删除,都是可以的。如果本地消息发送失败了,可能还会引
入重新发送的机制。
这都是消息发送者中自行写代码需要实现的。这样的话就能保证消息
最大程度地成功发送到消息中间件上。
2、消息由中间件投递到系统B
(1)消息中间件收到消息后负责将该消息同步投递给相应的下游系
统,并触发下游系统的业务处理。
(2)当下游系统业务处理成功后,向消息中间件反馈确认应答,消息
中间件便可以将该条消息删除,从而该事务完成。
(3)对于投递失败或者是未应答的消息,对于中间件来讲就会将消息
保存到失败消息表中,并且对于表中的数据利用重试机制进行多次投
递。如果多次投递的结果均为失败,失败消息表就会记录这条消息。
(4)消息中间件需要提供失败消息的查询接口,下游系统会定期查询
失败消息,并将其消费。最后需要一个定期校对者,所谓的定期校对
者就是在固定时间后查询表中是否有相应的数据,如果有就自行触发
业务处理,从而对失败消息进行消费。
三、优缺点分析
1、优点
一种非常经典的实现,在最大程度上实现了最终一致性。因为各种各
样的判断和重试以及定期校对可以保证最大程度上的分布式事务一
致性。
2、缺点
消息表会偶合到业务系统中,而在业界并没有成型的方案去解决,必
须写许多的代码,比较繁琐。如果没有封装好的解决方案,会有很多
杂活需要处理。
