CAP定理的缺点


2000 年,埃里克-布鲁尔(Eric Brewer)在 "分布式计算原理会议"(Principles of Distributed Computing conference)上发表题为 "迈向稳健的分布式系统"(Towards Robust Distributed Systems)的主题演讲时提出了 CAP 定理。布鲁尔提出,分布式系统无法同时实现一致性、可用性和分区容忍性。虽然布鲁尔将 CAP 表述为一个定理,但在当时,布鲁尔对 CAP 的解释仅仅是一种定理,因为布鲁尔并没有提供形式证明来支持这一定理。

2002 年,塞斯-吉尔伯特和南希-林奇公布了布鲁尔定理的形式证明,以及一致性、可用性和分区容错网络服务的可行性,使他们对 CAP 的解释成为定理。

什么是CAP定理?
CAP定理试图提出在分区存在的情况下一致性与可用性之间的冲突,而 CAP 定理则试图将在分区存在的情况下一致性与可用性之间的冲突形式化。

从形式上讲,定理都把一致性定义为系统的安全属性,把可用性定义为系统的有效属性:

  • 一致性:每个读取请求都会收到一个表示成功的响应,并反映最近一次写入请求的值或表示失败的响应。
  • 可用性:每个读取请求都会收到一个表示成功的响应(不一定反映最近一次写入请求的值)。

此外,定理都将网络分区定义为底层系统模型的故障模式:

  • 网络分区:网络分区将网络划分为若干网段,从一个网段的节点发送到其他网段节点的信息会丢失。

从形式上看,CAP定理在定义上存在分歧,导致CAP定理无法比较。

埃里克-布鲁尔将 CAP 表述为 "三选二 "框架。三选二 "的解释意味着网络分区是可选的,你可以选择加入或退出。然而,在现实的系统模型中,网络分区是不可避免的。因此,容忍分区的能力是一个不可协商的要求,而不是一个可选属性。

既然必须考虑网络分区,那么在发生分区时,就必须在一致性和可用性之间做出选择。

换句话说,CAP 将世界分为 CP 系统和 AP 系统


CAP 定理坏处
塞斯-吉尔伯特(Seth Gilbert)和南希-林奇(Nancy Lynch)发表了一个定理,在其系统模型的特定假设和限制条件下,提供了形式的数学阐述。

吉尔伯特和林奇的系统模型由 C、N₁ 和 N₂ 三个节点组成。节点没有时钟,通过异步网络收发信息进行通信。N₁ 和 N₂ 一开始具有相同的值 v₀。此外,让我们考虑 N₁ 和 N₂ 之间的永久网络分区。C 与 N₁ 和 N₂ 之间仍然可以通信,但 N₁ 和 N₂ 之间不能通信。

  • 为了证明不可能同时实现一致性、可用性和分区容错,吉尔伯特和林奇采用了矛盾证明法
  • 为了避免矛盾,假设存在一种算法,允许系统在这种网络分区下既保持一致性又具有可用性。
  • 我们发现了一个矛盾:我们最初的假设,即这个系统可能既一致又可用,被证明是错误的。

CAP 定理通常被理解为证明了(某种进一步未指定的)强一致性无法通过高可用性实现,而(某种进一步未指定的)弱一致性可以通过高可用性实现。

然而,在永久分区的情况下,任何信息都无法从一个分区流向另一个分区。
因此:
在有永久分区的系统中,即使是最弱形式的一致性也是不可能实现的

另一方面,在非永久性分区的情况下,如果要求请求最终(即在无限制的时间内)得到响应,那么就可以实现强一致性和弱一致性。

请注意,吉尔伯特和林奇的定义要求任何非故障节点都能生成有效响应,而不仅仅是某些非故障节点,即使该节点与其他节点隔离。这是一个不必要且不现实的限制。从本质上讲,这种限制使得共识协议的可用性不高,因为只有部分节点,即占多数的节点,能够做出响应。

共识算法 就是要在保持强大一致性的同时实现高可用性

结论
CAP 定理对分布式系统界既有积极影响,也有消极影响。积极的一面是,CAP 让我们学会思考分布式系统中固有的权衡问题。然而,在负面影响方面,CAP 常常被误用为终止对话的决定性论据,即使 CAP 可能并不适用于当前的设计挑战。

虽然许多软件工程师会引用 CAP 定理来证明其设计决策的合理性,但全面了解后就会发现,CAP 定理在 "理论上 "适用,但在 "实践中 "可能并不适用于当前的设计挑战。

何去何从?
一致性和可用性之间的权衡是存在的,但 CAP 是最没用的思考框架

我最喜欢的框架是 "不变汇合"(Invariant confluence),它在 "数据库系统中的协调规避"(Coordination Avoidance in Database Systems)一文中作了介绍。

不变汇合决定了应用程序是否需要协调才能正确执行。

该论文引用了 CAP 定理,这对我来说不无讽刺意味。