CAP定理又稱布魯爾定理,是電腦科學家 Eric brewer 提出的,是分散式系統領域的一個定理。
若想設計一個分散式架構的系統,掌握這項定理不可或缺。
**C是Consistency,也就是一致性,在CAP中的是強一致性。A是Availability ,可用性。P是Partition tolerance,分割槽容錯性。在分散式系統中三者不可兼得,只能選兩個。這就是CAP定理。**例如你保證了一致性和分割槽容錯性就無法保證可用性。
Consistency
這裡的一致性是強一致性,強一致性的意思就是例如節點A更新了資料,節點B能同時更新,這樣客戶端在每次讀取獲得資料都是最近更新的。但是 在定理中是忽略掉我們平日裡的網路延遲的。現實情況網路延遲在現在還是無法避免的,所以我們只能實現最終一致性,但是目標還是貼近強一致性,也就是盡力降低延時的時間。
Availability
可用性指的是非故障的節點需要在合理的時間返回合理的響應。合理的響應的意思也就是不能搞個報錯,不能是超時失敗。舉個例子比如說節點A更新了資料,同時要釋出到節點B上,但是中間傳輸的電纜被挖掘機挖斷了,此時使用者去訪問節點B,此時節點B應該返回老的資料,而不應該報錯。這就是可用性。讓使用者感覺系統還是能用的。
Partition tolerance
分割槽容錯性,指的是當網路分割槽了,系統還能正常的執行和響應。比如節點A和節點B無法通訊,你要考慮這個時候系統如何應該。雖然網路分割槽的概率低而且時間短但是這種情況是會發生的。所以理論上是犧牲C或者A,P是一定要達到的。
舉個例子,把P扔了。所以此時系統需要保證CA,然後此時發生了網路分割槽,節點A和B無法通訊了,此時客戶端想要往節點A寫入資料,但是因為此時無法同步資料至節點B。所以只有保證A不寫入因此才能保證一致性。那你不讓客戶端往A寫資料,你就只能報個錯返回給客戶端,說此時不能寫,那是不是違反了可用性了?
所以在分散式系統中P是一定要保證的。所以在分散式系統中是CP,AP這樣搭配的。
那CA呢?請注意, CAP所說的CAP三者只能存在兩者,所以CA是可以能搭配的。就是在系統沒有P的時候,CA搭配。也就是說當系統不存在分割槽情況的時候要滿足C和A,當系統出現分割槽情況的之後視情況拋棄C或者A。
注意
CAP理論不是系統級別的,是資料級別的。啥意思呢?
也就是說當出現網路分割槽的情況,你可以一部分資料遵守CP,一部分資料遵守AP。例如使用者註冊場景可以上CP,保證使用者註冊之後登入的成功。而使用者更換頭像這種就上AP,畢竟用舊的資料影響也不會很大。
因此我們要根據不同的業務場景來選擇不同的應對方案。CAP是可以靈活搭配的