冷飯熱炒:想成為架構師,你必須掌握的CAP細節(jié)
1. CAP理論關注的是數(shù)據(jù)而非整個系統(tǒng)
- CAP理論的核心是針對分布式系統(tǒng)中數(shù)據(jù)的設計權衡,而不是整個系統(tǒng)統(tǒng)一選擇CP或AP。
- 系統(tǒng)內部不同數(shù)據(jù)或操作場景可能需要不同的CAP策略:
示例用戶管理系統(tǒng)中,用戶賬號數(shù)據(jù)(如ID、密碼)通常選擇CP(強一致性),以確保安全性;用戶信息數(shù)據(jù)(如昵稱、簡介)可選擇AP(高可用性),允許短暫不一致。
如果整個系統(tǒng)統(tǒng)一選擇CP或AP,會導致某些場景需求無法滿足,設計失衡。
- 架構師應根據(jù)數(shù)據(jù)類型和業(yè)務場景,將數(shù)據(jù)分類并分別選擇CP或AP策略,而不是對整個系統(tǒng)“一刀切”。
2. 一致性(C)的現(xiàn)實挑戰(zhàn)
- 分布式系統(tǒng)中,數(shù)據(jù)從一個節(jié)點同步到其他節(jié)點需要時間(即使是毫秒級延遲),導致嚴格一致性(所有節(jié)點同時擁有相同數(shù)據(jù))在實踐中難以實現(xiàn)。
- 嚴格一致性場景
對于強一致性要求高的業(yè)務(如用戶余額、商品庫存),理論上需要CP,但實際中因同步延遲,CP可能退化為CA(單一節(jié)點寫入,其他節(jié)點備份)。
這種場景下,分布式多點寫入難以實現(xiàn),系統(tǒng)可能需要犧牲分布式特性,采用主從架構。
- 實際意義即使是CP系統(tǒng),也可能因延遲而短暫不一致,需通過日志或補償機制確保最終一致性。
3. 正常運行時可同時滿足CA
- CAP理論的前提是網(wǎng)絡分區(qū)(P)發(fā)生時必須在C和A之間選擇,但在無分區(qū)時,系統(tǒng)可同時滿足一致性(C)和可用性(A)。
- 實現(xiàn)方式
用戶賬號數(shù)據(jù):可通過消息隊列實現(xiàn)CA,保證強一致性,但實現(xiàn)復雜。
用戶信息數(shù)據(jù):可通過數(shù)據(jù)異步同步實現(xiàn)CA,簡單但一致性要求較低。
- 架構設計時需考慮分區(qū)發(fā)生時的CP或AP選擇,同時優(yōu)化無分區(qū)時的CA實現(xiàn)。
4. “犧牲”不等于完全放棄
- CAP理論中的“犧牲”(如放棄C或A)僅指分區(qū)期間無法保證該屬性,而非永遠放棄。
- 分區(qū)時間通常較短(例如,99.99%可用性系統(tǒng)一年不可用時間僅約50分鐘),因此需為分區(qū)恢復做準備:
CP系統(tǒng)示例用戶賬號數(shù)據(jù)在分區(qū)時,節(jié)點1可繼續(xù)注冊新用戶,節(jié)點2返回錯誤(犧牲A)。節(jié)點1記錄未同步數(shù)據(jù)到日志,分區(qū)恢復后同步至節(jié)點2,恢復CA狀態(tài)。
AP系統(tǒng)示例用戶信息數(shù)據(jù)在分區(qū)時,節(jié)點1和節(jié)點2可獨立修改(如用戶愛好),分區(qū)恢復后通過規(guī)則(如最后寫入優(yōu)先)合并數(shù)據(jù),或人工介入解決沖突,達到最終一致性。
- 分區(qū)期間的日志記錄和恢復機制是確保系統(tǒng)在分區(qū)后恢復CA的關鍵。
5. ACID與CAP的對比
- ACID是數(shù)據(jù)庫事務的理論,包含:
原子性事務操作全完成或全不完成。
一致性事務前后數(shù)據(jù)完整性不被破壞。
隔離性并發(fā)事務不干擾,隔離級別包括未提交讀、提交讀、可重復讀、串行化。
持久性事務完成后數(shù)據(jù)持久保存。
- ACID與CAP的區(qū)別
ACID的A(原子性)與CAP的A(可用性)含義不同。
ACID的C關注數(shù)據(jù)庫完整性(如約束條件),CAP的C關注分布式節(jié)點間數(shù)據(jù)一致性。
ACID適用于數(shù)據(jù)庫事務場景,CAP適用于分布式系統(tǒng)設計,二者關注點不同,類似關系數(shù)據(jù)庫和NoSQL的差異。
6. BASE理論作為CAP的延伸
- BASE是對CAP中AP方案的補充,強調:
基本可用分區(qū)時允許損失部分可用性,優(yōu)先保證核心功能(如登錄優(yōu)于注冊)。
軟狀態(tài)允許系統(tǒng)存在中間狀態(tài)(數(shù)據(jù)不一致),不影響整體可用性。
最終一致性數(shù)據(jù)副本在一定時間后達到一致。
- 與CAP的關系
BASE是對AP方案的細化,強調分區(qū)期間放棄一致性,但通過最終一致性在分區(qū)恢復后達成一致。
CP系統(tǒng)也可能實現(xiàn)最終一致性(因同步延遲),但“一定時間”較短(如毫秒級)。
- 示例
微博系統(tǒng):用戶賬號數(shù)據(jù)需1分鐘內一致(登錄場景),新微博可容忍30分鐘不一致(用戶無感知)。
核心功能(如登錄)優(yōu)先級高于非核心功能(如注冊),需明確區(qū)分。
7. CAP理論中的延遲問題
- CAP理論忽略了網(wǎng)絡延遲,但現(xiàn)實中延遲不可避免(即使毫秒級)。
- 即使CP系統(tǒng),在數(shù)據(jù)同步的短暫時間內也會出現(xiàn)不一致,實際效果接近最終一致性。
- AP系統(tǒng)在分區(qū)期間放棄一致性,但分區(qū)恢復后需通過機制(如日志、合并規(guī)則)達到最終一致性。
8. 設計電網(wǎng)網(wǎng)站的思考題
- 問題
設計電網(wǎng)網(wǎng)站的架構,需考慮CAP理論。
- 建議設計
核心數(shù)據(jù)(如電費賬單、交易記錄)選擇CP,確保一致性和分區(qū)容錯性,因賬單錯誤會導致嚴重后果。分區(qū)時可通過日志記錄未同步數(shù)據(jù),恢復后同步。
非核心數(shù)據(jù)(如用戶信息、公告)選擇AP,優(yōu)先可用性,允許短暫不一致,分區(qū)恢復后通過合并規(guī)則(如最后更新優(yōu)先)達成一致。
正常運行優(yōu)化CA實現(xiàn),核心數(shù)據(jù)用消息隊列,非核心數(shù)據(jù)用異步同步。
分區(qū)恢復記錄分區(qū)期間的操作日志,恢復后通過自動或人工合并恢復CA狀態(tài)。


















