如何在系統設計中使用CAP定理?
什麼是CAP定理?在Consistency一致性, Availability可用性, Partition-tolerance分割槽容忍性三者之中只能選兩。
CP: 高一致性C和分割槽容忍性P的系統,放棄可用性A。
AP: 可用性A和分割槽容忍性P的系統,放棄高一致性C。
AC: 可用性A和高一致性C系統,放棄分割槽容忍性P。
根據CAP定理,存在網路分割槽的情況下,只能在可用性和一致性之間選擇。
以下面一個簡單案例為例,寫操作在主節點伺服器,讀操作在從節點伺服器:
CLient ----> Web-API -----> 分散式快取/DB(寫操作在主節點+讀操作在從節點)
假設有一個網路分割槽:
CLient ----> Web-API -----> 分散式快取/DB(主節點+ 這裡增加了網路分割槽 +從節點)
如果因為網路分割槽通訊出錯,導致主從伺服器節點無法同步資料,寫入主節點的資料,無法在從節點伺服器讀出。
我們只能做兩件事,在事務完成後傳送500錯誤響應給使用者,放棄了可用性,破壞使用者體驗,這是一種悲觀做法,另外一個樂觀做法是早點傳送200正確響應給使用者,放棄一致性,保住可用性,保住了使用者體驗。
哪個更好?沒有哪個更好,完全取決於場景情況決定。
那麼誰在兩個方案中做決定呢?如果是開發團隊,也許不太對,任何一種方法選擇需要根據以下因素決定:
1. 實現高一致性C的成本是多少?或者不一致性的成本是多少?
2.達到高可用性有多重要?還是仍出一個錯誤資訊更合適?
3.可以容忍多長的延遲?接近無窮大∞的高延遲等於沒有可用性。
4.方案複雜性如何?
那麼除了以上方案,有沒有可選的設計思路?
PACELC定理
如果有分割槽P,那就是在可用性和一致性之間平衡選擇。
否則,就是在延遲Latency和一致性之間平衡選擇。
高可用性和高一致性是我們完美的追求,但是存在網路分割槽情況下,魚和熊掌是不可兼得的。
變通方法:放棄一點高一致性,獲得一點高可用性(低延遲),也就是最終一致性方式。
如何針對我們這個案例實現最終一致性?
1. 針對耗時的API呼叫使用非同步響應給使用者。
2. 在後臺做所有的寫操作工作。
3. 在資料庫叢集和快取達成共識,同時不讓使用者等待。
這樣做的結果是開發與業務兩個方面雙贏。
CP: 高一致性C和分割槽容忍性P的系統,放棄可用性A。
AP: 可用性A和分割槽容忍性P的系統,放棄高一致性C。
AC: 可用性A和高一致性C系統,放棄分割槽容忍性P。
根據CAP定理,存在網路分割槽的情況下,只能在可用性和一致性之間選擇。
以下面一個簡單案例為例,寫操作在主節點伺服器,讀操作在從節點伺服器:
CLient ----> Web-API -----> 分散式快取/DB(寫操作在主節點+讀操作在從節點)
假設有一個網路分割槽:
CLient ----> Web-API -----> 分散式快取/DB(主節點+ 這裡增加了網路分割槽 +從節點)
如果因為網路分割槽通訊出錯,導致主從伺服器節點無法同步資料,寫入主節點的資料,無法在從節點伺服器讀出。
我們只能做兩件事,在事務完成後傳送500錯誤響應給使用者,放棄了可用性,破壞使用者體驗,這是一種悲觀做法,另外一個樂觀做法是早點傳送200正確響應給使用者,放棄一致性,保住可用性,保住了使用者體驗。
哪個更好?沒有哪個更好,完全取決於場景情況決定。
那麼誰在兩個方案中做決定呢?如果是開發團隊,也許不太對,任何一種方法選擇需要根據以下因素決定:
1. 實現高一致性C的成本是多少?或者不一致性的成本是多少?
2.達到高可用性有多重要?還是仍出一個錯誤資訊更合適?
3.可以容忍多長的延遲?接近無窮大∞的高延遲等於沒有可用性。
4.方案複雜性如何?
那麼除了以上方案,有沒有可選的設計思路?
PACELC定理
PACELC定理如下:
If there is Partition, how does the system trade-off between Availability and Consistency Else how does the system trade-off between Latency and Consistency <p class="indent"> |
如果有分割槽P,那就是在可用性和一致性之間平衡選擇。
否則,就是在延遲Latency和一致性之間平衡選擇。
高可用性和高一致性是我們完美的追求,但是存在網路分割槽情況下,魚和熊掌是不可兼得的。
變通方法:放棄一點高一致性,獲得一點高可用性(低延遲),也就是最終一致性方式。
如何針對我們這個案例實現最終一致性?
1. 針對耗時的API呼叫使用非同步響應給使用者。
2. 在後臺做所有的寫操作工作。
3. 在資料庫叢集和快取達成共識,同時不讓使用者等待。
這樣做的結果是開發與業務兩個方面雙贏。
結論
在系統設計中考慮CAP定理是重要的。必須考慮整個系統的所有故障點。Casandra,Zoo Keeper,Kafka等技術可以在資料層面實現最終一致性。在AP和CP之間選擇並不容易。在大多數情況下,它取決於業務要求。
How we used CAP theorem in our system design? – Je
banq補充:CAP中P是網路分割槽容忍性的意思,實際中兩個資料中心就存在網路分割槽,因為資料中心之間的網路通訊很大部分不可靠,會出現網路故障,在出現網路通訊故障導致兩個資料中心之間訊息丟失,那麼這兩個分割槽是否還能各自獨立可用,如果可用,產生新的資料,就會不一致。網路分割槽P也可以存在於資料同步中,如果後臺有一個程式進行資料同步,那麼這個同步經常如果遭遇網路失敗是否重試,重試次數多少次?如果無限次重試,那麼就是選擇一致性C高於可用性A,反之,如果重試幾次以後就放棄希望人工介入,那麼就是一致性要求不那麼高,可用性A高於一致性了。
[該貼被admin於2018-01-04 17:46修改過]
相關文章
- CAP定理在分散式系統設計中的最新應用分散式
- Java分散式系統設計:CAP定理與BASE理論Java分散式
- 分散式系統CAP定理教程分散式
- 「系統架構」CAP定理的含義架構
- 分散式系統知識分享:正確理解CAP定理分散式
- CAP定理的缺點
- 分散式系統設計權衡之 CAP分散式
- 分散式系統設計權衡之CAP分散式
- ACID中C與CAP定理中C的區別
- 分散式理論(一) - CAP定理分散式
- 系統架構設計面試指南(01)-微服務和CAP架構面試微服務
- 架構師都該懂的 CAP 定理架構
- 分散式系統中的CAP、ACID、BASE概念分散式
- 談談從CAP定理到Lambda架構的演化架構
- 如何在介面設計中“色”誘使用者
- 如何在Windows 11系統中將任意檔案(如bat/log等)固定在開始選單?WindowsBAT
- 張大胖和CAP定理(分散式系統、可用性、一致性、分割槽容錯性)分散式
- 分散式系統的 CAP 理論分散式
- 分散式設計理論之CAP分散式
- 如何在Windows 8 中設定和修改系統電源Windows
- 三面阿里,面試官:講講分散式的CAP定理阿里面試分散式
- 資料庫選型繞不開“CAP定理”是什麼資料庫
- 設計師教你如何在介面設計中“色”誘你的使用者
- 遊戲中的技能系統設計遊戲
- 電商系統設計之商品 (中)
- mysql如收集統計資訊MySql
- 編織如程式設計程式設計
- 分散式系統CAP的原理介紹分散式
- 分散式系統理論基礎 - CAP分散式
- 【系統設計】系統設計中經常使用的20個高階資料結構和演算法資料結構演算法
- 如何在Mac系統中安裝Win7系統MacWin7
- 展廳中控系統方案設計
- 如何在linux中搭建JEECMS系統Linux
- 分散式系統理論基礎2 :CAP分散式
- 分散式系統:CAP 理論的前世今生分散式
- 分散式系統之CAP理論雜記分散式
- 如何在Mac上設定系統範圍的字數統計服務Mac
- 條款 19:設計 class 猶如設計 type