重新理解 CAP:分區容錯不可犧牲,選擇只是假象
CAP 定理常被簡化為「一致性、可用性、分區容錯三選二」,導致許多架構師以為可以犧牲 P (Partition Tolerance) 選 CA。實際上網絡分區在分布式系統中必然發生(交換機故障、GC 停頓、線纜斷裂等),因此 P 不可選,真正的權衡只在 C 與 A 之間,且還存在「兩者都不保證」的灰度地帶。
1. 為什麼 CA 系統不存在
- CA 意味著「無分區時保證 C 和 A」,一旦出現分區,系統行為未定義(可能同時失去 C 和 A)。
- 將「不處理分區」寫入 SLA 如同設計飛船只能在大氣層飛行——現實環境不允許。
- 真實世界中,所謂 CA 系統在分區發生時往往退化為「不可用且不一致」。
2. CP / AP 的現實意義
| 類型 | 分區時行為 | 典型系統 |
| CP | 犧牲可用性(拒寫/拒讀)保證強一致性 | ZooKeeper, etcd, HBase |
| AP | 犧牲強一致性(允許舊讀/衝突)保證可用性 | Cassandra, DynamoDB, Riak |
3. 運營視角的 CA:其實是「未定義行為」模式
Nicolas Liochon 指出 CA 更像運營規範:系統承諾在正常網絡下提供 C&A,但分區屬於運營範圍外。這並非架構屬性,而是故障域劃分。
4. 選擇的假象
- 理論上有 2³=8 種組合,但 P=0 不存在 → 剩 4 種。
- 實際部署中,系統往往動態切換:無分區時 CA,有分區時按配置切 CP 或 AP。
- 甚至可針對不同數據類型選擇不同策略(如用戶余額 CP,日誌 AP)。
5. 實踐建議
- 接受分區必然發生,設計時預設 P=1。
- 業務層面明確哪些數據需要強一致 (CP),哪些可最終一致 (AP)。
- 監控分區發生頻率與持續時間,作為架構演進依據。
- 不要迷信「CA 架構」,除非系統永遠運行在單機或極可靠局域網(極罕見)。
6. 結語
CAP 不是鐵律,而是提醒我們在分布式系統中必須面對權衡。真正的架構設計是在業務語義下,為每類數據選擇合適的 C/A/P 組合,而非在理論圖上勾選兩個角。
- 上一篇文章: 《Oracle 查詢優化改寫》第四章心得:MERGE 替代 UPDATE 的性能優勢實測
- 下一篇文章: Oracle 入門全攻略:常見誤區、學習路線與預期成果
Copyright ©
程式碼之家 All Rights Reserved