看起來很唬人,然而卻簡單實用的CAP理論

在作分佈式系統開發時,咱們常常會或多或少的聽到CAP理論、或者是處理節點間數據一致性的問題。
但CAP理論到底是什麼呢?網絡


CAP理論很簡單,但倒是不少軟件設計的宏觀指導,所以也有人將之稱爲架構師必須掌握的理論之一。
鑑於理論的東西相對來講比較抽象並且繁瑣,所以咱們先舉個例子:
有一天你打王者榮耀連跪,因而找了一個大神魯班,帶你起飛:架構

因而就發生了下邊的對話分佈式

---------------------------------------------------------------
(1)
射手魯班:救救我,謝謝spa

輔助蔡文姬:收到
(2)
輔助蔡文姬:我來抓人了架構設計

 射手魯班:收到設計

若是一切良好,那麼一切都OK
可是倘若這時候YY語音忽然掛掉了3d

---------------------------------------------------------------
(1)射手魯班:救救我,謝謝blog

 蔡文姬,沒有響應遊戲

(2)輔助蔡文姬:我來抓人了開發

 射手魯班,沒有響應

---------------------------------------------------------------

那麼接下來有兩種策略:
一、 暫時先無論YY語音的問題,繼續打好遊戲。
二、先不打遊戲了,切屏打電話給對方,看下是否是發生了什麼情況


是的,這涉及到所謂的CAP理論了,
也就是在分佈式場景下,若是不一樣節點之間的通訊出現了問題,那麼不一樣節點的響應策略應該是什麼樣的。是該暫停響應,等待鏈接恢復,仍是應該堅持響應,忽略數據的不一致性。
咱們先來看下計算機領域中,CAP的專業解釋:

一致性 Consistency:在分佈式系統中,全部的數據備份,在任意時刻都要求一致;
可用性 Availability:對於分佈式系統中的節點,在任意時候均可以正常的進行讀寫響應,而且不超時;
分區容錯性 Partition tolerance:當節點之間的通訊出現(防盜鏈接:本文首發自http://www.cnblogs.com/jilodream/ )故障時,整個分佈式系統仍然能夠運行起來,不至於直接崩潰掉;
P是背景,也就是在分佈式系統下,若是節點之間的通訊出現了問題,那麼整個系統仍然在運行,等待網絡恢復後,整個系統仍然能夠正常操做。

通過理論以及實際的推演,咱們發如今P的背景下,AC不能夠共存。
也就是你沒法作到既保證了節點的可用性,還保證了一致性。
專業的推演證實,這裏就不說了,筆者本身的理解是這樣的:
當節點之間的網絡崩潰時,節點若是想要可以支持可用性,勢必會形成數據的修改,從而形成數據的不一致,而網絡又崩潰掉,所以沒有辦法進行節點間的數據同步。如今對於接下來的處理策略有兩個選擇:
(1)若是節點想要支持一致性呢,那麼惟一的選擇就是不能進行數據的寫,這是由於節點之間沒法進行數據的同步,所以只能放棄寫操做,這就致使失去了高可用性。
(2)若是支持了寫,那麼就會出現節點間的數據不一致,而且因爲網絡問題,沒法及時同步,這就失去了高一直性。

這套理論有什麼用呢?
他能夠明確指出,對於分佈式系統來講,沒法作出數據完美一直,並且有高可用的場景。架構設計必需要作出取捨。
一、聽從可用性,放棄高一致性
二、支持高一直性,放棄高可用性
具體應該如何選擇,由業務來決定。若是你的系統支持短暫的業務停頓,可是系統不能出錯,那麼就要傾向於CP方案,如實時通話系統,財務交易系統。若是你的系統支持暫時的數據不一致性,可是必定要保證高可用性,如直播點贊,評論。那麼就要傾向於AP方案。無所謂哪一種方案更優秀,而是須要由業務來驅動技術的選型。
不少人說,不是CAP,三者取其二麼?爲何你這裏只有CP,和AP?
這兩種理解其實均可以,可是(注意,要畫重點了)
P所表明的是分區容忍性,是指分佈式場景下,對於網絡通訊問題下仍然可用,這個是前提。
CP和AP是基於這個前提討論的兩種方案。若是劃掉P,取AC,也就是單機場景下的一致性和可用性(防盜鏈接:本文首發自http://www.cnblogs.com/jilodream/ )問題,這就失去了討論的意義。這比如在中學物理中R=U/I ,電阻等於電壓除以電流。可是你不能理解爲電阻與電壓成正比,與電流成反比,由於電阻只與材料和規格相關。你能夠按照公式推算出數據,可是不表明是字面的含義。

另外須要注意的是,上述狀況下,都是理論模型,其中忽略了數據一致性所須要的網絡延遲。也就是說,在實際狀況中,因爲網絡的延時問題,高效的CP系統很是難實現。同時又因爲互聯網產品中自己須要的快速響應,因此在實際的開發中,每每AP模式的設計,相對來講佔比會更大一點。那麼如何規避掉數據不一致性形成的影響呢?
這裏提供兩個思路
一、 數據的最終一致性,出現一致性問題不要緊,只要不影響到核心的數據計算,是能夠接受的。只要最終的數據可以保證一致性,知足冪等性便可。
二、 縮短數據一致性恢復的時間,也就是若是出現數據不一致的問題,系統能夠想辦法縮短恢復數據的耗時,若是當請求再次進來時,若是數據已經恢復完成,那麼對於外界來講,就不會感知到這次的不一致。

相關文章
相關標籤/搜索