当我们请工人装修房子时,“快捷、便宜、质量好”往往我们只能选其中两个。
什么是CAP定理
CAP是分布式架构中提出的一种类似于上面逻辑的定理,即分布式系统只能提供三个所需特征中的两个:consistency(C)、availability(A)、partition tolerance(P)。
该定理也被称之为Brewer定理,它是由Eric A.Brewer在2000年的一次关于分布式计算的演讲中首次提出的。两年后麻省理工学院教授Seth Gilbert和Nancy Lynch发表了Brewer猜想的证明。
分布式系统是一种同时在多个物理或虚拟节点上存储数据的网络
CAP所对应的三个分布式系统的特征
consistency - 一致性
一致性意味着所有客户端在同一时间看到相同的数据,无论他们连接到哪个节点。要保证这一点,当数据写入到某一个节点时,在写入被视为“成功”时,它必须立即转发或者复制该数据到系统中的所有其他节点。
这里说的一致性非最终一致性
availability - 可用性
可用性意味着任何对系统发出数据请求的客户端都能得到响应,即使一个或多个节点宕机或网络故障。
partition tolerance - 分区容忍
分区容忍意味着当分布式系统中产生通信中断(简单来讲就是不能及时同步数据,比如两个节点之间丢失连接或短暂延迟)时,集群(分布式系统)必须继续工作。
为什么只能三选二(其实是在P的前提下,C和A二选一)
很多博主都以网络故障或某节点挂掉为前提来解释为什么C和A只能二选一,我认为这是不准确的,分布式系统天然存在网络分区,那么网络故障是无法避免的,即使没有网络故障,网络分区之间通讯也是存在延迟的,所以数据同步肯定会存在延迟(无论延迟时间长短),数据存会不一致。那么在网络存在分区的情况下,有两个选项:一致性或可用性。
- 当选择一致性而不是可用性时,如果由于网络分区而不能保证特定信息是最新的,收到客户端请求时,系统将返回一个错误或超时也就是不能正常响应客户端,直到数据一致。
- 当选择可用性而不是一致性时,系统将始终处理查询,并尝试返回信息的最新可用版本也就是能正常响应客户端,即使由于网络分区而不能保证它是最新的。
在没有分区的情况下,可用性和一致性都能得到保证。
理解CAP定理可以帮助我们在设计一个运行于多个位置的基于微服务的应用程序时,能意识到可用性和一致性我们只能保证一个,从而根据实际业务需求来做选择。
【完】