CAP 理论
CAP定理来自计算机科学,它描述了分布式系统背后的某些基本原理。CAP是Consistency(一致性)、Availability(可用性)和Partition tolerance(分区容忍性)的首字母缩写。
CAP定理宣称,在一个分布式系统的设计中,一致性、可用性和分区容忍性这三种特性无法同时被满足,我们只能在这三者中选择两个。
为什么必须选P(分区容忍性)?
在实践中,分布式系统的节点分布在不同的网络和地域中,由于无法预知或控制所有网络条件,因此网络分区(也就是网络通信断裂)是不可避免的。如果我们的系统不具有分区容忍性,那么当网络分区发生的时候,整个系统就可能无法正常运行。这是我们绝对无法接受的,因此,我们必须选择P。
为什么CA只能二选一(一致性和可用性只能选择其一)?
当网络分区发生时,系统的一部分节点可能无法与其他节点通信。这时,系统需要做出选择:是停止服务以等待网络恢复,从而保证一致性(C),还是继续提供服务,放弃一致性以保证可用性(A)。
如果选择保证一致性(C),即当网络分区发生时,系统拒绝一切请求,因为它不能保证每个节点都会得到更新的数据,从而牺牲了可用性(A)。
如果选择保证可用性(A),即当网络分区发生时,系统仍然继续接受和处理请求,即使它不能保证所有节点的数据都是最新的,从而牺牲了一致性(C)。
举例
假设我们有一个全球性的电子商务平台,该平台在全球范围内有多个服务器节点。现在假设购物车服务遇到一个问题,消费者把商品加入购物车,但是在某些情况下会发生商品消失的情况,这显然是我们不能接受的。
如果我们按照CAP的理论,就需要在一致性、可用性、分区容忍性之间做出选择。
如果我们选择CA(一致性和可用性),那么在网络分区的情况下,我们可能需要将所有的节点全部停机,以确保所有请求都是新的和一致的。但实际上这是我们不能接受的,因为停机意味着无法提供服务给用户,会对企业的利润产生重大影响。
如果我们选择CP(一致性和分区容忍性),当网络分区发生时,我们可能会阻止新用户加入,直到网络连接恢复。这样可以保证所有的请求都能得到一致的结果,但可用性会受到影响,因为在网络问题正在被处理的过程中,新用户无法使用播放列表服务。
如果我们选择AP(可用性和分区容忍性),即使网络出现问题,我们也会尽力保证所有用户都能正常使用服务,但这可能会导致数据的一致性问题。如在网络分区的情况下,某些节点可能无法及时更新数据,导致用户看到的可能是旧的数据。
对于电商平台,我们更可能选择AP,因为在用户体验上,相比保证数据的绝对一致性,我们更希望保证服务的可用性。然而选择AP并不代表我们完全放弃一致性,而是采用一些手段来在一定程度上保证一致性,如 eventual consistency(最终一致性),这就是我们常说的 BASE模型。