这是小卷对分布式系统架构学习的第13篇文章,今天学习面试中高频问题:分布式事务,为什么要用分布式事务,分布式事务的实现方案有哪些,方案对比优缺点
单体架构时,以本地事务为例,业务场景是下单场景,用户下单、创建订单、扣减库存这些操作都可以在一个数据库事务中完成。
而随着业务的增长,系统转变为分布式系统,原有的单体架构也拆分为多个微服务。下单场景需要在多个服务间操作,需要保证所有操作都能成功,保证整个下单流程的数据一致性,就需要用到分布式事务了
遵循ACID,对数据要求强一致性
遵循BASE,允许一定时间内不同节点的数据不一致,但要求最终一致。
这里重新复习一遍BASE理论是什么:
基本可用:是指系统出现未知故障时,还是能用的;
软状态:允许系统存在中间态,即所有副本数据允许存在延迟;
最终一致性:存在软状态,在一定时间后,所有副本数据保持一致,从而达到数据最终一致性;
刚性事务指的是强一致性,基础是XA协议,XA协议是一个基于数据库的分布式事务协议,其分为两部分:事务管理器(Transaction Manager)**和**本地资源管理器(Resource Manager)。事务管理器作为一个全局的调度者,负责对各个本地资源管理器统一号令提交或者回滚;
而2PC (两阶段提交)和3PC(三阶段提交)都是由XA协议衍生出来的
引入一个作为协调者(coordinator)的组件来统一掌控所有参与者(participant)的操作结果,并最终指示这些节点是否要把操作结果进行真正的提交
2PC指的是 Prepare & Commit
第一阶段:准备阶段:
第二阶段:提交阶段
两阶段提交的缺点:
2PC只适用于两个数据库(数据库实现了XA协议)之间使用,限制较大,两个系统间无法使用
在2PC的基础上,第一阶段和第二阶段中插入一个准备阶段,同时在协调者和参与者中都引入超时机制,当参与者为收到协调者发送的commit请求后,也会对本地事务commit,不会一直阻塞等待
过程如下:
小结:
2PC存在使用限制的问题,3PC存在数据不一致的问题,两者在实际中很少使用;
柔性事务要求最终一致性,允许有中间态,柔性事务可以分为:TCC、Saga、本地消息表、MQ事务方案、最大努力通知
TCC(Try Confirm Cancel)补偿事务,与2PC不同的是,2PC是在DB层面,TCC是在应用层面
三个操作步骤:
Saga可以看做一个异步的、利用队列实现的补偿事务。
由一系列本地事务构成,每个本地事务更新了数据库后,会发布一条消息来触发Saga中的下一个本地事务的执行,如果某个本地事务失败了,Saga会执行这个失败事务之前 已提交的所有事务的补偿操作
Saga的实现最流行的两种方式是:
基于事件的方式
事务回滚:
本地消息表的核心是将分布式事务拆成本地事务进行处理,最初是由eBay提出的
下面以一个订单场景具体说明本地消息表的实现
例如,可以在订单库新增一个消息表,将新增订单和新增消息放到一个事务里完成,然后通过轮询的方式去查询消息表,将消息推送到 MQ,库存服务去消费 MQ。
执行流程为:
优点:方案轻量,消息可靠性不依赖消息中间件;
缺点:与业务强耦合,不可公用,消息数据与业务库同库,占资源;
MQ事务是对本地消息表的封装,将本地消息表存到MQ内部了,而不是业务数据库
将两个事务通过消息队列进行异步解耦,加上重试机制保证最终一致性
发消息逻辑如下:
缺点:一次消息发送需要两次网络请求(half + commit/rolllback消息)
也成为定期校对,是对MQ事务的进一步优化。
事务发起方增加了消息校对接口,也就是查询接口,事务接收方可以自行调用接口主动获取操作结果
逻辑如下:
事务主动方尽最大努力(重试,轮询....)将事务发送给事务接收方,但是仍然存在消息接收不到,此时需要事务被动方主动调用事务主动方的消息校对接口查询业务消息并消费,这种通知的可靠性是由事务被动方保证的
适用场景:
业务通知类型的场景,如微信交易的结果,就是通过最大努力通知方式通知各个商户,既有回调通知,也有交易查询接口
开源的分布式事务解决方案,提供了AT、TCC、SAGA、XA事务模式,不需要自己手动实现分布式事务,直接使用框架就行
有以下几个角色:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。