若想設計一個分佈式架構的系統,掌握這項定理不可或缺。網絡
**C是Consistency,也就是一致性,在CAP中的是強一致性。A是Availability ,可用性。P是Partition tolerance,分區容錯性。在分佈式系統中三者不可兼得,只能選兩個。這就是CAP定理。**例如你保證了一致性和分區容錯性就沒法保證可用性。 架構
這裏的一致性是強一致性,強一致性的意思就是例如節點A更新了數據,節點B能同時更新,這樣客戶端在每次讀取得到數據都是最近更新的。可是在定理中是忽略掉咱們平日裏的網絡延遲的。現實狀況網絡延遲在如今仍是沒法避免的,因此咱們只能實現最終一致性,可是目標仍是貼近強一致性,也就是盡力下降延時的時間。分佈式
可用性指的是非故障的節點須要在合理的時間返回合理的響應。合理的響應的意思也就是不能搞個報錯,不能是超時失敗。舉個例子好比說節點A更新了數據,同時要發佈到節點B上,可是中間傳輸的電纜被挖掘機挖斷了,此時用戶去訪問節點B,此時節點B應該返回老的數據,而不該該報錯。這就是可用性。讓用戶感受系統仍是能用的。設計
分區容錯性,指的是當網絡分區了,系統還能正常的運行和響應。好比節點A和節點B沒法通訊,你要考慮這個時候系統如何應該。雖然網絡分區的機率低並且時間短可是這種狀況是會發生的。因此理論上是犧牲C或者A,P是必定要達到的。cdn
舉個例子,把P扔了。因此此時系統須要保證CA,而後此時發生了網絡分區,節點A和B沒法通訊了,此時客戶端想要往節點A寫入數據,可是由於此時沒法同步數據至節點B。因此只有保證A不寫入所以才能保證一致性。那你不讓客戶端往A寫數據,你就只能報個錯返回給客戶端,說此時不能寫,那是否是違反了可用性了?blog
因此在分佈式系統中P是必定要保證的。因此在分佈式系統中是CP,AP這樣搭配的。同步
那CA呢?請注意,CAP所說的CAP三者只能存在二者,因此CA是能夠能搭配的。就是在系統沒有P的時候,CA搭配。也就是說當系統不存在分區狀況的時候要知足C和A,當系統出現分區狀況的以後視狀況拋棄C或者A。it
CAP理論不是系統級別的,是數據級別的。啥意思呢?io
也就是說當出現網絡分區的狀況,你能夠一部分數據遵照CP,一部分數據遵照AP。例如用戶註冊場景能夠上CP,保證用戶註冊以後登陸的成功。而用戶更換頭像這種就上AP,畢竟用舊的數據影響也不會很大。class
所以咱們要根據不一樣的業務場景來選擇不一樣的應對方案。CAP是能夠靈活搭配的
若有錯誤歡迎指正! 我的公衆號:yes的練級攻略