分布式事务在分布式系统经常遇见,也是大厂经常考察的内容,下面我就重点详解四大主流分布式事务方案@mikechen
分布式事务
分布式事务是指涉及多个参与者,通常是不同的计算机节点或服务的事务操作,因此需要跨多个节点执行事务操作。
如下图所示:
图片
分布式事务需要确保所有相关操作要么全部成功执行,要么全部回滚,以维护数据的一致性和可靠性。
分布式事务解决方案
常见的分布式事务解决方案,主要包含有以下四种:
两阶段提交协议
两阶段提交协议,Two-Phase Commit,简称是2PC,该协议包括:准备和提交两个阶段。
如下图所示:
图片
1.准备阶段
协调者向所有参与者发送准备请求,参与者执行事务准备,并向协调者发送准备就绪的通知。
2.提交阶段
如果所有参与者都准备就绪,则协调者向所有参与者发送提交请求,参与者执行事务提交。
如果所有参与者都成功提交了事务,则事务成功完成。
否则,如果任何一个参与者失败或者无法提交,则所有参与者都会被要求回滚(Rollback)事务,以保持一致性。
2PC的优点是简单易懂,并且在理想情况下能够保证分布式系统中事务的原子性和一致性。
两阶段有如下几个缺点:
1.阻塞问题
在2PC的准备阶段,协调者需要等待所有参与者的响应,这可能会导致整个系统的阻塞。
2.单点故障
在2PC中,协调者是一个单点,它负责协调所有参与者的操作。
如果协调者发生故障,那么整个事务可能会无法完成,即使参与者的大部分已经准备好了,这种单点故障会影响系统的可用性和可靠性。
3.数据不一致性
2PC无法处理所有故障情况,例如:协调者和参与者之间的网络分区或者通信失败。
在这种情况下,可能会出现数据不一致性,一些参与者已经提交了事务,而另一些参与者却未收到提交指令,导致系统状态混乱。
三阶段提交协议
三阶段提交协议,Three-phase commit, 简称是3PC,3PC是2PC的改进版。
如下图所示:
图片
3PC的主要思想是引入一个【预提交阶段】,以减轻2PC中的阻塞问题,同时保持原子性和一致性。
3PC,主要分为三个阶段:
1.预提交阶段
协调者询问参与者是否可以提交事务,并等待它们的响应,如果所有参与者都同意,则进入下一阶段。
2.提交阶段
协调者向所有参与者发送提交请求,要求它们提交事务,如果任何参与者无法提交,则执行回滚。
3.确认阶段
协调者向所有参与者发送确认消息,告知它们事务已经提交,这一阶段用于解决2PC中的阻塞问题。
3PC相较于2PC的优点是在第一阶段引入了一个“询问”阶段,避免了2PC的直接准备阶段可能出现的长时间阻塞问题。
两阶段与三阶段对比,如下图所示:
图片
补偿事务
TCC(Try-Confirm-Cancel)是一种补偿性事务处理模式,用于实现分布式系统中的一致性操作。
如下图所示:
图片
TCC模式通过三个阶段的操作来确保事务的一致性:尝试(Try)、确认(Confirm)和取消(Cancel)。
1.尝试阶段(Try)
在尝试阶段,系统会尝试执行事务操作的所有必要检查和准备工作,以确保事务能够成功执行。
这包括检查资源的可用性、锁定所需资源等,如果所有的检查都通过,系统会记录下所有的尝试操作,但并不会实际执行事务。
2.确认阶段(Confirm)
在确认阶段,系统会执行事务操作,并且确认之前所做的尝试操作。
如果事务操作成功执行,系统将确认并提交事务,在这个阶段,系统会持久化事务的结果,确保事务的最终执行。
3.取消阶段(Cancel)
如果在尝试阶段或者确认阶段发生了错误或者异常情况,系统将进入取消阶段。
在这个阶段,系统会执行逆向操作,取消之前尝试阶段所做的操作,这样可以确保系统的状态回滚到事务开始之前的状态,以维持数据的一致性。
TCC模式允许开发人员在每个阶段都定义自己的业务逻辑和补偿操作,以适应不同的业务需求。
但是,TCC模式要求开发人员在每个阶段都显式定义业务逻辑和补偿操作,这增加了系统的复杂性和开发成本,需要设计和维护每个阶段的逻辑,并确保它们之间的一致性。
最终一致性
最终一致性是分布式系统中的一种一致性模型,它允许数据副本在一段时间内的状态之间存在不一致,但最终将会达到一致的状态。
如下图所示:
图片
在最终一致性模型中,节点之间的数据同步通常是通过消息传递来实现的。
当一个节点的数据发生变化时,它会通过异步方式将消息发送给其他节点,由于消息传递是异步的,因此节点之间的数据同步可能会有一定的延迟。
因此,最终一致性模型允许节点之间的数据副本,在一段时间内存在不一致,但最终会收敛到一致的状态。