CAP定理的缺點

banq發表於2024-03-12


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 定理,這對我來說不無諷刺意味。


 

相關文章