CAP定理是分佈式系統中最基礎的原則。因此理解和掌握了CAP,對系統架構的設計相當重要。網絡
「 CAP定理 」又被稱爲 布魯爾定理,它提出對於一個分佈式系統而言,不能同時知足如下三點:架構
也就是說CAP定理指明瞭,任何分佈式系統只能同時知足這三項中的兩項。分佈式
如上圖,若是是最多同時知足兩項,那咱們能夠有三個組合:CA、CP、AP。在聊這三個組合以前,咱們先分別看一下 Consisteny(一致性)、Availability(可用性)、Partition tolerance(分區容錯性)的含義。設計
假設某個系統當前有兩個節點A和B,兩個節點分別能夠由Actor進行讀寫,兩個節點之間的數據會自動完成同步。blog
1. Consisteny(一致性)同步
一致性的要求是指,對於任何客戶端(上圖Actor)來講,每次的讀操做,都能得到最新的數據。即,當有客戶端向A節點寫入了新數據以後,其它客戶端從B節點中進行讀操做所得到的數據必須也是最新的,是與A節點數據保持一致的。it
2. Availability(可用性)io
可用性的要求是指,每一個請求都能在合理的時間內得到符合預期的響應(不保證獲取的結果是最新的數據)。系統架構
按照上圖來看就是,客戶端只要向A節點或B節點發起請求後,只要這兩個節點收到了請求,就必須響應給客戶端,但不須要保證響應的值是否正確。基礎
3. Partition tolerance(分區容錯性)
分區容錯性是指,當節點之間的網絡出現問題以後,系統依然能正常提供服務。
講完了C、A、P的含義和要求,咱們繼續來看看它們之間如何組合使用。
2、CAP怎麼應用
有 CA、CP、AP 三種組合方式,可是在分佈式系統的結構下,網絡是不可能作到100%可靠的。若是選擇 CA組合,放棄 P(分區容錯性)。仍是以最上面的圖中A和B節點來舉例,當發生節點間網絡故障時,爲了保證 C(一致性),那麼就必須將系統鎖住,不容許任何寫入操做,否者就會出現節點之間數據不一致了。可是鎖住了系統,就意味着當有寫請求進來的時候,系統是不可用的,這一點又違背了 A(可用性)原則。
所以分佈式系統理論上是不可能有CA組合的,因此咱們只能選擇 CP 和 AP組合架構。
下面咱們來詳細看一下 CP架構 和 AP架構的特色:
CP 架構
CP架構即 Consisteny(一致性)與 Partition tolerance(分區容錯性)的組合。
1. 如上圖,因爲網絡問題,節點A和節點B以前不能互相通信。當有客戶端(上圖Actor)向節點A進行寫入請求時(準備寫入Message 2),節點A會不接收寫入操做,致使寫入失敗,這樣就保證了節點A和節點B的數據一致性,即保證了Consisteny(一致性)。
而後,若是有另外一個客戶端(上圖另外一個Actor)向B節點進行讀請求的時候,B請求返回的是網絡故障以前所保存的信息(Message 1),而且這個信息是與節點A一致的,是整個系統最後一次成功寫入的信息,是能正常提供服務的,即保證了Partition tolerance(分區容錯性)。
上述狀況就是保障了CP架構,但放棄了Availability(可用性)的方案。
2. AP 架構
AP架構即 Availability(可用性)與 Partition tolerance(分區容錯性)的組合架構。
如上圖,因爲網絡問題,節點A和節點B以前不能互相通信。當有客戶端(上圖Actor)向節點A進行寫入請求時(準備寫入Message 2),節點A容許寫入,請求操做成功。但此時,因爲A和B節點以前沒法通信,因此B節點的數據仍是舊的(Message 1)。當有客戶端向B節點發起讀請求時候,讀到的數據是舊數據,與在A節點讀到的數據不一致。但因爲系統能照常提供服務,因此知足了Availability(可用性)要求。
所以,這種狀況下,就是保障了AP架構,但其放棄了 Consisteny(一致性)。
以上,就是對CAP定理的一些思考。但願對你們有所幫助。
參考 https://mp.weixin.qq.com/s/BtHPlZOvy8HNK1TuOrDxLA