共计 3044 个字符,预计需要花费 8 分钟才能阅读完成。
随着互联网的倒退和技术的不断更新,越来越多的应用程序开始采纳分布式架构。然而,因为数据和解决逻辑的分散性和异构性,分布式环境下的事务处理面临着许多挑战。这时候就须要采纳分布式事务来确保零碎的一致性和可靠性。
分布式事务是指在分布式系统中,波及多个节点的事务操作。它须要保障所有节点的数据可能实现一致性,同时在执行过程中呈现任何谬误时可能回滚操作。发动事务的客户端收回提交申请后,分布式事务处理器会协调各个节点的参与者,保障所有操作的一致性。
在分布式事务的钻研中,存在多种不同的实现办法。其中,基于两阶段提交(two-phase commit,2PC)的计划是最常见的一种。2PC 协定分为投票和决策两个阶段。在投票阶段,协调者会向参与者发送申请确认是否能够提交事务,参与者会投票返回是否批准;在决策阶段,协调者会依据参与者的投票后果做出提交或回滚的决策。
然而,2PC 协定存在着一些毛病。首先,协定的确定性使得事务处理器须要期待所有参与者的响应。这会导致系统的响应工夫变长,限度了零碎的可扩展性。其次,在协调者宕机或网络故障的状况下,参与者将无奈失去回滚或提交的音讯,从而导致事务无奈实现。此外,2PC 协定在解决故障时须要冗余的措施和容错设计,减少了零碎复杂性和老本。
因而,近年来一些新的分布式事务协定被提出来,试图解决 2PC 协定的毛病。其中,基于拜占庭容错(Byzantine fault tolerance,BFT)的算法成为了一个热门的选项。BFT 算法可能保障在局部节点故障时也能达到一致性,从而进步了零碎的可用性。
总的来说,分布式事务是分布式系统中保证数据一致性的关键技术。传统的基于 2PC 协定实现的分布式事务因为存在局限性,而一些基于 BFT 等容错算法的新型协定也开始逐步失去关注。随着技术的一直倒退,分布式事务的钻研也将一直晋升,为分布式系统的稳定性和可靠性提供更好的解决方案。
在分布式事务的实现计划中,除了基于 2PC 协定和 BFT 算法的计划外,还有以下几种:
1、弥补事务(Compensating Transaction)
弥补事务是一种针对分布式事务的回滚形式。在弥补事务中,先执行一个与失常操作相同的操作进行“回滚”,再进行“弥补”操作。弥补操作能够在失常操作失败或者回滚操作胜利之后立刻开始执行,而无需期待所有参与者的操作实现。弥补事务的毛病是须要实现弥补机制,减少了零碎复杂度,而且在简单穿插流程中弥补机制的实现更加艰难。
举例来说,支付宝在进行订单领取的过程中,就采纳了弥补事务的形式。如果领取胜利然而下单失败,支付宝会立刻发动退款,进行弥补操作。
2、TCC 弥补(Try-Confirm-Cancel Compensate)
TCC 弥补模式是一种把整个操作分为三个步骤的事务模式:预留资源、确认操作、回滚操作。在分布式环境下,能够通过别离实现“try”、“confirm”和“cancel”的三个阶段来实现分布式事务的管制。在 TCC 弥补的过程中,不论是否执行齐全部操作,都须要进行回滚。
TCC 弥补式序列性执行,可靠性高,然而因为须要在每个阶段都进行资源预留,大量的操作可能导致资源节约和性能瓶颈。
举例来说,国内购物网站苏宁易购在订单预约、付款、发货等流程中,采纳了 TCC 模式。
3、三阶段提交(Three-Phase Commit,3PC)
相较于两阶段提交,三阶段提交是一种更加牢靠的事务处理,能够解决 2PC 协定的一些毛病。3PC 协定由准备阶段、指令阶段和提交阶段组成。在准备阶段,协调者向参与者发送申请并期待响应;在指令阶段,协调着会发送提交或回滚命令,参与者也会期待接管响应;在提交阶段,协调者期待所有参与者提交或回滚后再进行操作。
三阶段提交的长处是进步了零碎的可靠性和效率,因为其只有在所有参与者都能够提交或回滚时才进行解决。然而,其毛病是仍然存在局限性,无奈齐全解决分布式 system 的问题。
举例来说,英国航空公司在票务零碎中就采纳了 3PC 来解决票务的预约、领取、发车等流程。
4、XA:
XA 是两阶段提交(2PC)协定的具体实现之一。XA 协定将分布式事务分为两个阶段:筹备阶段和提交阶段。在筹备阶段,每个参加事务的节点(包含协调者和参与者)会回复一个 yes 或者 no 信号以表明他们是否准备就绪。在筹备阶段完结后,协调者依据参与者的响应进行决策,发送提交或回滚音讯。XA 协定通过 2PC 协定来协调在分布式环境下数据的一致性。XA 协定尽管牢靠,然而因为其须要进行两个阶段的响应期待,从而导致事务处理时延较大。
5、Seata 是一种开源的跨多个服务或实例的分布式事务解决方案,目标是为了解决微服务架构中面临的分布式事务问题。Seata 为解决全局事务提供了三种模式:AT 模式、TCC 模式和 Saga 模式。
5.1、AT 模式:
Seata 的 AT 模式是基于两阶段型(2PC)的分布式事务解决方案,Seata AT 模式通过在数据源处插入 undo_log 来补救事务管理器的部分提交和反悔操作解决全局事务的原子性问题。
5.2、TCC 模式:
Seata 的 TCC 模式是基于 Try-Confirm-Cancel 的分布式事务解决方案,它通过回滚与重试操作解决了全局事务的原子性问题。TCC 是指在分布式事务的三个阶段中,由业务本人编写对应的 Try、Confirm、Cancel 操作来保障全局事务的原子性。
5.3、SAGA 模式:
Seata 的 Saga 模式则是基于部分弥补机制的分布式事务解决方案,通过每个服务具体实现本人的弥补来保障全局事务的完整性。Saga 由多个弥补事务 (high water mark) 组成,一旦某个弥补事务执行失败就只回滚其后面胜利的事务。
总的来说,Seata 提供了牢靠、高效的分布式事务场景解决方案,尤其是在简单的微服务架构中,Seata 能够高效地治理全局事务,使得分布式业务在长期运行中保持数据的一致性和完整性。
6、半音讯事务
分布式事务半音讯事务是一种在分布式系统中,确保音讯可靠性和事务性的解决方案。它将分布式事务和音讯队列相结合,通过两阶段提交协定来实现音讯可靠性和事务性。
具体来说,分布式半音讯事务包含两个阶段:
6.1、阶段一
在分布式事务的发起方将分布式事务的开始事件以半音讯的模式发送到音讯队列中。半音讯在发送后,并不立刻被生产,因为此时事务并没有提交,只有通过二次确认后,才会由音讯队列生产和解决。
6.2、阶段二
当分布式事务的参与方将事务状态提交时,音讯队列正式生产前一步发送的半音讯,进行业务解决。如果事务的提交胜利,音讯就被确认生产,否则音讯就被回滚。这就是音讯的二次确认机制。
上面举一个购物零碎的例子来阐明分布式半音讯事务的应用。当用户购物时,须要进行扣款和库存更新操作,这两个操作须要在同一个事务中进行,确保扣款和更新同时胜利或同时失败。
- 在购物零碎中,用户下单后产生一个订单,产生相应的领取申请,将领取申请以半音讯的模式发送到音讯队列中。
- 如果领取申请发送胜利,则执行本地数据库操作,将扣款和库存更新操作放在同一个本地事务中。
- 当所有的本地事务都执行胜利后,将对应的领取申请标记为曾经确认,此时音讯队列正式生产前一步的半音讯,执行扣款和库存更新操作。
- 如果确认失败,则回滚本次扣款和库存更新操作,领取申请也被标记为曾经回滚。
通过这种形式,能够在保障扣款和库存更新在一个事务中的状况下,确保音讯的可靠性和事务性,防止了音讯和数据库数据不统一的问题。
本文由 ChatGPT 一键生成
本文由 mdnice 多平台公布