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