1. 前言
最近在看分布式事务,于是网上搜索相关资料,霎时间,对方给我扔来了一大堆概念,什么二阶段提交、三阶段提交、TCC补偿机制、CAP理论、ACID、BASE等等等,它们被零散地分散到各种各样的文章里。这里我根据自己所学习到的,以及所理解的方式,将这些概念放到一起谈一谈,一方面做个记录,一方面也希望可以帮助像鄙人一样的新手将这些概念有机地串连起来
2. 正片开始
话不多说,不再说那么多关于单机系统到分布式系统的介绍了,在分布式系统的设计中,有位大佬提出了CAP理论,根据CAP,也延伸出了ACID、BASE这些理论
2.1. CAP
C、A、P分别代表了3个特性,这个理论是说这个3个特性不能共存,只能共存2个,为什么呢?
先假设一个分布式系统如下图所示
接下来说说C、A、P各个特性
2.1.1. C(consistency,一致性)
写之后的读操作必须读到最新值
如:S1、S2上有a=0,然后client向S1修改了a=1,此时client再去S2读取a也要等于1
就是S1更改完值后要立即同步到S2
不同角度看:
- 客户端:并发来访问数据,都要能访问到最新值
- 服务务端:某个服务里的数据变化了,要更新到整个分布式系统,保证各个服务的数据是一致的
根据一致性程度分:
- 强一致性:更新后的值会被立即同步到整个系统,这会导致同步时访问服务会被阻塞
- 弱一致性:更新后的值没有立即同步到整个系统,但会在一定时间内同步好
- 最终一致性:是特殊的弱一致性,即达到同步的这一段时间会比较长,但保证最终数据都是一致的
2.1.2. A(availability,可用性)
只要用户发起请求,就要立即给出反应,不能有操作失败 / 请求超时的情况
2.1.3. P(partition tolerance,分区容错性)
某个服务故障了,整体依旧可以对外提供服务,这是设计分布式系统的基础
所以P在分布式系统中一般是必备的,不然就和单机系统没区别了
2.1.4. 为什么3个特性不能共存
先假设P存在,则C(一致性)和A(可用性)就会矛盾了
注意
:这里的一致性其实是针对强一致性,弱一致性和可用性还是可以共存的
分区容错下,多个服务间通信一定会有网络问题
- 满足强一致性时,一定会有数据同步的阻塞时间,导致客户端访问被阻塞,就达不到可用性了
- 满足可用性时,客户端访问要立即返回,这时数据还没同步好,得到的是不一致的数据
那假设P不存在,则CA可以共存,这就类似一个单机应用,没了分布式可言
2.2. ACID
这个大家都比较熟悉了,是关系型数据库事务的特性
其实它也是满足CA的情况
2.3. BASE
这是CAP的延伸,权衡了可用性和一致性而提出的理论,相当于满足PA的情况
为什么说相当于呢,因为并没有完全舍弃C,只是舍弃强一致性,保留了最终一致性
下面说说BASE的各个特性
2.3.1. BA(basically vavilable,基本可用)
- 响应时间上:可能因为网络故障导致响应时间延长一点点
- 功能上:由于某个服务突然被大量访问,那新来的访问被降级到其他服务,如返回网络繁忙等等
2.3.2. S(soft state,软状态)
允许系统中的某些数据处于中间状态,且这些中间状态不影响整体的可用性,即允许各个节点之间的数据同步存在延迟
2.3.3. E(eventually consistent,最终一致性)
不能保证每时每刻访问的都是最新的数据,但保证一段时间后,最终数据都是一致的
2.4. 小结
所以CAP、ACID、BASE说的都是分布式系统设计的理论,还没具体地说到分布式事务的相关理论
从上面看来,貌似ACID、BASE是不能共存,不过在实际的系统设计中,根据各个功能的要求,有机地结合ACID、BASE,寻找最优的协调方案才是最合适的
3. 进入分布式事务
据我所知,现在实现分布式事务的设计方案应该有3种,分别就是二阶段提交、三阶段提交和TCC
他们都有2种重要的角色【事务协调者】【参与者,也就是各个服务】