CAP定理又稱做布魯爾定理。node
對於一個分佈式計算系統,不可能同時知足一致性(Consistence)、可用性(Availability)、分區容錯性(Partition Tolerance)三個設計約束。網絡
在一個分佈式系統(指互相鏈接並共享數據的節點的集合)中,當涉及讀寫操做時,只能保證一致性、可用性、分區容錯性三者中的兩個,另一個必須被犧牲。架構
全部節點在同一時刻都能看到相同的數據。分佈式
對某個指定的客戶端來講,讀操做保證可以返回最新的寫操做結果。post
差別點:設計
第二版更符合咱們觀察和評估系統的方式,即站在客戶端的角度來觀察系統的行爲和特徵。cdn
對於系統執行事務來講,在事務執行過程當中,系統其實處於一個不一致的狀態,不一樣的節點的數據並不徹底一致對象
每一個請求都能獲得成功或者失敗的響應。blog
非故障的節點在合理的時間內返回合理的響應(不是錯誤和超時的響應)。事務
差別點:
初版的every request是不嚴謹的,由於只有非故障節點才能知足可用性要求,若是節點自己就故障了,發給節點的請求不必定能獲得一個響應。
初版的success/failure的定義太泛了,幾乎任何狀況,不管是否符合CAP理論,咱們均可以說請求成功和失敗,由於超時也算失敗、錯誤也算失敗、異常也算失敗、結果不正確也算失敗;即便是成功的響應,也不必定是正確的。例如,原本應該返回100,但實際上返回了90,這就是成功的響應,但並無獲得正確的結果。相比之下,第二版的解釋明確了不能超時、不能出錯,結果是合理的,注意沒有說「正確」的結果。
出現消息丟失或者分區錯誤時系統可以繼續運行。
當出現網絡分區後,系統可以繼續「履行職責」。
差別點:
work強調「運行」,只要系統不宕機,咱們均可以說系統在work,返回錯誤也是work,拒絕服務也算work;而function強調「發揮做用」「履行職責」,這點和可用性是一脈相承的。也就是說,只有返回reasonable response纔是function。
初版是直接說緣由,即message loss形成了分區,但message loss的定義有點狹隘,由於一般咱們說的是message loss(丟包),只是網絡故障的一種;第二版直接說現象,即發生分區現象 ,無論什麼緣由,多是丟包,也多是鏈接中斷,還多是擁塞,只要致使了網絡分區,就統統算在裏面。
雖然CAP理論定義是三個要素中只能取兩個,但放到分佈式環境下來思考,咱們會發現必須選擇P(分區容錯)要素,由於網絡自己沒法作到100%可靠,有可能出故障,因此分區是一個必然的現象。若是咱們選了CA而放棄P,那麼當發生分區現象時,爲了保證C,系統須要禁止寫入,當有寫入請求時,系統返回error(例如,當前系統不容許寫入),這又和A衝突了,由於A要求返回no error和 no timeout。所以,分佈式系統理論上不可能選擇CA架構,只能選擇CP或者AP架構。
以下圖所示,爲了保證一致性,當發生分區現象後,N1節點上的數據已經更新到y,但因爲N1和N2之間的複製通道中斷,數據y沒法同步到N2,N2節點上的數據仍是x。這時客戶端C訪問N2時,N2須要返回error,提示客戶端C「系統如今發生了錯誤」,這種處理方式違背了可用性的要求,所以CAP三者只能知足CP。
以下圖所示,爲了保證可用性,當發生分區現象後,N1節點上的數據已經更新到y,但因爲N1和N2之間的複製通道中斷,數據y沒法同步到N2,N2節點上的數據仍是x。這時客戶端C訪問N2時,N2將當前本身擁有的數據x返回給客戶端C了,而實際上當前最新的數據已是y了,這就不知足一致性的要求了,所以CAP三者只能知足AP。注意:這裏N2節點返回x,雖然不是一個「正確」的結果,可是一個「合理」的結果,由於x是舊的數據,並非一個錯亂的值。
注:有興趣瞭解極客時間專欄的同窗,能夠查看極客時間專欄—可提供返現服務