调研 | 5种分布式事务解决方案优缺点对比

发布时间:2023-09-06 点击:80
云计算
背景
分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个东西,特别是在微服务架构中,几乎可以说是无法避免。
acid
指数据库事务正确执行的四个基本要素:
原子性(atomicity)
一致性(consistency)
隔离性(isolation)
持久性(durability)
cap
cap原则又称cap定理,指的是在一个分布式系统中,一致性(consistency)、可用性(availability)、分区容忍性(partition tolerance)。cap 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。
一致性:在分布式系统中的所有数据备份,在同一时刻是否同样的值。
可用性:在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。
分区容忍性:以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在c和a之间做出选择。
base理论
base理论是对cap中的一致性和可用性进行一个权衡的结果,理论的核心思想就是:我们无法做到强一致,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性。
basically available(基本可用)
soft state(软状态)
eventually consistent(最终一致性)
解决方案
01
两阶段提交(2pc)
两阶段提交2pc是分布式事务中最强大的事务类型之一,两段提交就是分两个阶段提交,第一阶段询问各个事务数据源是否准备好,第二阶段才真正将数据提交给事务数据源。
为了保证该事务可以满足acid,就要引入一个协调者(cooradinator)。其他的节点被称为参与者(participant)。协调者负责调度参与者的行为,并最终决定这些参与者是否要把事务进行提交。处理流程如下:
阶段一
a)?协调者向所有参与者发送事务内容,询问是否可以提交事务,并等待答复。
b)?各参与者执行事务操作,将 undo 和 redo 信息记入事务日志中(但不提交事务)。
c)?如参与者执行成功,给协调者反馈 yes,否则反馈 no。
?阶段二
如果协调者收到了参与者的失败消息或者超时,直接给每个参与者发送回滚(rollback)消息;否则,发送提交(commit)消息。两种情况处理如下:
情况1:当所有参与者均反馈 yes,提交事务
a)?协调者向所有参与者发出正式提交事务的请求(即 commit 请求)。
b)?参与者执行 commit 请求,并释放整个事务期间占用的资源。
c)?各参与者向协调者反馈 ack(应答)完成的消息。
d)?协调者收到所有参与者反馈的 ack 消息后,即完成事务提交。
情况2:当有一个参与者反馈 no,回滚事务
a)?协调者向所有参与者发出回滚请求(即 rollback 请求)。
b)?参与者使用阶段 1 中的 undo 信息执行回滚操作,并释放整个事务期间占用的资源。
c)?各参与者向协调者反馈 ack 完成的消息。
d)?协调者收到所有参与者反馈的 ack 消息后,即完成事务。
问题
1)?性能问题:所有参与者在事务提交阶段处于同步阻塞状态,占用系统资源,容易导致性能瓶颈。
2)?可靠性问题:如果协调者存在单点故障问题,或出现故障,提供者将一直处于锁定状态。
3)?数据一致性问题:在阶段 2 中,如果出现协调者和参与者都挂了的情况,有可能导致数据不一致。
优点:尽量保证了数据的强一致,适合对数据强一致要求很高的关键领域。(其实也不能100%%u4fdd证强一致)。
缺点:实现复杂,牺牲了可用性,对性能影响较大,不适合高并发高性能场景。
02
三阶段提交(3pc)
三阶段提交是在二阶段提交上的改进版本,3pc最关键要解决的就是协调者和参与者同时挂掉的问题,所以3pc把2pc的准备阶段再次一分为二,这样三阶段提交。处理流程如下:
阶段一
a)?协调者向所有参与者发出包含事务内容的 cancommit 请求,询问是否可以提交事务,并等待所有参与者答复。
b)?参与者收到 cancommit 请求后,如果认为可以执行事务操作,则反馈 yes 并进入预备状态,否则反馈 no。
阶段二
协调者根据参与者响应情况,有以下两种可能。
情况1:所有参与者均反馈 yes,协调者预执行事务
a)?协调者向所有参与者发出 precommit 请求,进入准备阶段。
b)?参与者收到 precommit 请求后,执行事务操作,将 undo 和 redo 信息记入事务日志中(但不提交事务)。
c)?各参与者向协调者反馈 ack 响应或 no 响应,并等待最终指令。
情况2:只要有一个参与者反馈 no,或者等待超时后协调者尚无法收到所有提供者的反馈,即中断事务
a)?协调者向所有参与者发出 abort 请求。
b)?无论收到协调者发出的 abort 请求,或者在等待协调者请求过程中出现超时,参与者均会中断事务。
阶段三
该阶段进行真正的事务提交,也可以分为以下两种情况。
情况 1:所有参与者均反馈 ack 响应,执行真正的事务提交
a)?如果协调者处于工作状态,则向所有参与者发出 do commit 请求。
b)?参与者收到 do commit 请求后,会正式执行事务提交,并释放整个事务期间占用的资源。
c)?各参与者向协调者反馈 ack 完成的消息。
d)?协调者收到所有参与者反馈的 ack 消息后,即完成事务提交。
情况2:只要有一个参与者反馈 no,或者等待超时后协调组尚无法收到所有提供者的反馈,即回滚事务。
a)?如果协调者处于工作状态,向所有参与者发出 rollback 请求。
b)?参与者使用阶段 1 中的 undo 信息执行回滚操作,并释放整个事务期间占用的资源。
c)?各参与者向协调组反馈 ack 完成的消息。
d)?协调组收到所有参与者反馈的 ack 消息后,即完成事务回滚。
优点:相比二阶段提交,三阶段提交降低了阻塞范围,在等待超时后协调者或参与者会中断事务。避免了协调者单点问题。阶段 3 中协调者出现问题时,参与者会继续提交事务。
缺点:数据不一致问题依然存在,当在参与者收到 precommit 请求后等待 do commite 指令时,此时如果协调者请求中断事务,而协调者无法与参与者正常通信,会导致参与者继续提交事务,造成数据不一致。
03
补偿事务(tcc)
tcc 是服务化的二阶段编程模型,采用的补偿机制:
条件:
需要实现确认和补偿逻辑
需要支持幂等
处理流程:
a) try 阶段主要是对业务系统做检测及资源预留。
这个阶段主要完成:
完成所有业务检查( 一致性 ) 。
预留必须业务资源( 准隔离性 ) 。
try 尝试执行业务。
b) confirm 阶段主要是对业务系统做确认提交。
try阶段执行成功并开始执行 confirm阶段时,默认 confirm阶段是不会出错的。即:只要try成功,confirm一定成功。
c) cancel 阶段主要是在业务执行错误,需要回滚的状态下执行的业务取消,预留资源释放。
优点:
性能提升:具体业务来实现控制资源锁的粒度变小,不会锁定整个资源。
数据最终一致性:基于 confirm 和 cancel 的幂等性,保证事务最终完成确认或者取消,保证数据的一致性。
可靠性:解决了 xa 协议的协调者单点故障问题,由主业务方发起并控制整个业务活动,业务活动管理器也变成多点,引入集群。
缺点:tcc 的 try、confirm 和 cancel 操作功能要按具体业务来实现,业务耦合度较高,提高了开发成本。
04
本地消息表(消息队列)
其核心思想是将分布式事务拆分成本地事务进行处理。
方案通过在消费者额外新建事务消息表,消费者处理业务和记录事务消息在本地事务中完成,轮询事务消息表的数据发送事务消息,提供者基于消息中间件消费事务消息表中的事务。
条件:?
服务消费者需要创建一张消息表,用来记录消息状态。
服务消费者和提供者需要支持幂等。
需要补偿逻辑。
每个节点上起定时线程,检查未处理完成或发出失败的消息,重新发出消息,即重试机制和幂等性机制。
处理流程:
1. 服务消费者把业务数据和消息一同提交,发起事务。
2. 消息经过mq发送到服务提供方,服务消费者等待处理结果。
3. 服务提供方接收消息,完成业务逻辑并通知消费者已处理的消息。
容错处理情况如下:
当步骤1处理出错,事务回滚,相当于什么都没有发生。
当步骤2、3处理出错,由于消息保存在消费者表中,可以重新发送到mq进行重试。
如果步骤3处理出错,且是业务上的失败,服务提供者发送消息通知消费者事务失败,且此时变为消费者发起回滚事务进行回滚逻辑。
优点:从应用设计开发的角度实现了消息数据的可

专业云端服务器租用公司
微信朋友圈广告全面开放@好友评论功能
linux中启动yarn集群的命令
什么叫域名投资?域名投资有哪些基础知识?
做网站怎么推广
如何获得虚拟主机
华为云便宜服务器
谷歌浏览器安装flash插件被拦截的详细解决方法