一、序言
本文介绍分布式事务相关的基本概念。
二、什么是分布式事务
分布式事务是指涉及多个独立计算机或系统的事务操作,这些计算机或系统可能位于不同的物理位置,彼此之间通过网络进行通信。分布式事务的目标是确保在分布式环境中的多个参与者之间执行的事务操作是原子性、一致性、隔离性和持久性(ACID)的。
在传统的单机事务中,ACID 特性是由数据库管理系统(DBMS)来保证的。但在分布式环境中,由于数据存储在不同的节点上,并且节点之间的通信可能会受到网络延迟、故障和分区等因素的影响,因此确保 ACID 特性变得更加复杂和困难。
三、CAP 定理
CAP 定理是由计算机科学家 Eric Brewer 在 2000 年提出的理论。它指出在分布式计算系统中,最多只能同时满足三个特性中的两个,这三个特性分别是一致性(Consistency)、可用性(Availability)和分区容错性(Partition Tolerance)。
- 一致性(Consistency):分布式系统中所有节点在同一时间点看到的数据是一致的。
- 可用性(Availability):分布式系统应该保证每个请求都能够收到一个非错误的响应(但是不能保证获取的数据为最新数据),而且这个响应应该在有限的时间内返回。
- 分区容错性(Partition Tolerance):网络分区发生了,系统每个分区仍能独立工作。
由于分布式系统中是通过网络通信的,出现分区是无法避免的(即分区容错性必须考虑)。在出现网络分区的情况下,我们必须在一致性和可用性之间做出权衡选择,即考虑系统选择 AP 方案还是 CP 方案。
四、BASE 理论
BASE 理论是分布式系统设计中的一种思想,用于解决分布式系统在可用性和一致性之间的权衡问题。BASE 理论的名称源自于其三个核心概念的首字母:
- 基本可用(Basically Available):系统在出现故障时仍然能够保证基本的可用性,即系统可以继续处理部分请求。
- 软状态(Soft State):软状态指的是系统中数据在一段时间内可以是不一致的,系统不需要实时保持数据的一致性。
- 最终一致性(Eventual Consistency):最终一致性是指系统中的所有节点最终会在某个时刻达到一致状态。
BASE 理论的主要目标是通过放宽对强一致性的要求,提高系统的可用性和性能,最终达到一致性的目标。
五、分布式事务处理模型
5.1 刚性事务模型
严格满足 ACID 特性的事务称为刚性事务。刚性事务要求在事务执行期间数据保持强一致性,即事务中的所有操作要么全部生效,要么全部失败,不允许出现部分生效的情况。这意味着,在一个事务中对数据的读操作会返回最新的数据,而写操作则会立即对所有节点生效。
刚性事务通常使用强一致性的分布式事务协议来实现,例如两阶段提交(2PC)或多阶段提交(3PC)。这种模式能够确保数据的一致性,但可能会影响系统的性能和可扩展性。
5.2 柔性事务模型
基于 BASE 理论的事务一般称为柔性事务。柔性事务放宽了一致性要求,允许在一定程度上牺牲一致性以换取系统的性能和可用性。在柔性事务中,系统允许数据在事务执行期间处于不一致的状态,但会在后续的时间内将数据同步至一致状态。
柔性事务通常使用异步复制、消息队列等技术来实现数据的最终一致性,即通过后台任务或定期同步等方式将数据在不同节点之间进行同步,以达到一致状态。由于放宽了一致性要求,柔性事务通常具有更好的性能和可扩展性,适用于高并发、大规模的分布式系统。
六、分布式事务解决方案
6.1 刚性事务解决方案
- 两阶段提交(Two-Phase Commit,2PC):2PC 是最早也是最常见的分布式事务解决方案之一。它通过协调者和参与者之间的通信来确保事务的原子性。第一阶段(准备阶段),协调者询问参与者是否可以提交事务,参与者将会准备好并且等待协调者的指示。第二阶段(提交/回滚阶段),协调者将会向所有参与者发送提交请求。如果所有参与者都同意提交,那么事务将会提交,否则将会回滚。
- 三阶段提交(Three-Phase Commit,3PC):3PC 是对 2PC 的改进,旨在解决 2PC 存在的一些问题,如协调者单点故障、长时间阻塞等。与 2PC 不同的是,3PC 引入了预提交阶段,使得事务在提交前更安全,减少了出现半提交的情况。
6.2 柔性事务解决方案
- TCC(Try-Confirm-Cancel):最早是由 Pat Helland 于2007年发表的一篇名为《Life beyond Distributed Transactions:an Apostate`s Opinion》的论文提出。其核心是:由开发人员在 try 阶段检查或预留资源,在 confirm 阶段执行业务提交事务,在 cancel 阶段取消事务和预留资源。
- 本地消息表:本地消息表的方案最初是由 ebay 提出。其核心思路是将分布式事务拆分成本地事务进行处理。方案内容为:事务发起方建立本地消息表,将事务的内容放入本地消息表中,异步去读取并处理本地消息表中的消息。
- 消息事务:消息事务可以看作本地消息表的另一种处理方式。在消息事务中,事务发起方将事务的内容发送到 MQ 中,订阅方订阅事务处理事务。最后,事务发起方反查 MQ 事务的处理状态,完成事务提交或回滚。
- 最大努力通知:事务发起方尽最大的努力将消息发送出去,但是接收方可能无法收到。该方案采用消息重复通知机制和消息校对机制来保证最终一致。