文章目錄
- 一、CAP
- 概念
- (1) 一緻性(Consistency)
- (2)可用性(Availability)
- (3)分區容忍性(Partition Tolerance)
- 二、避免使用 CAP
- 為什麼避免使用 CAP?
- (1) 隻能在 CA 和 AP 中選擇嘛?
- (2) CAP 關注的是一個分布式系統嘛?
- (3) 一個系統的選擇需要看實際情況
- 三、凡凡認為
- 四、引用
一、CAP
概念
CAP 有時也代表一緻性,可用性,分區容錯性,系統隻能支援其中兩個特性(CP 或 AP)。
(1) 一緻性(Consistency)
A read is guaranteed to return the most recent write for a given client
用戶端,保證讀操作能傳回大部分最近的寫操作結果
(2)可用性(Availability)
A non-failing node will return a reasonable response within a reasonable amount of time(no error or timeout)
非故障的節點在合理的時間内傳回合理的響應(不是錯誤和逾時的響應)
(3)分區容忍性(Partition Tolerance)
The system will continue to function when network paritions occur
當出現網絡分區後, 系統能夠繼續 “履行職責”
二、避免使用 CAP
主要是 CAP 的局限性
為什麼避免使用 CAP?
圍繞着 CAP 有太多的誤解與困擾,最後反而無法幫助我們更好地了解系統
(1) 隻能在 CA 和 AP 中選擇嘛?
- 在網絡正常的時候,系統可以同時保證一緻性(線性化)(C) 和 可用性(A)
- 在網絡故障的時候,必須要麼選擇一緻性(線性化)(C),要麼可用性(A)
SO,CAP 忽略了網絡故障。
即:選擇 CA 和 AP,是根據實際情況(條件)下,所處的狀态
(2) CAP 關注的是一個分布式系統嘛?
結論:CAP 關注的粒度是資料,而不是整個系統
一個系統可能處理隻是一種資料,若包含多種類型的資料,有的資料必須選擇 CP,有的資料必須選擇 AP
比如:使用者系統
- 使用者基本資訊資料(昵稱、性别和自我介紹等等),選擇 AP
- 使用者帳号資料(使用者ID、密碼),選擇 CP
(3) 一個系統的選擇需要看實際情況
舉個例子:
例如,現代多核CPU上的記憶體甚至就是非線性化(不一緻性):如果某個CPU核上運作的線程修改一個記憶體位址,緊接着另一個CPU核上的線程嘗試讀取,則系統無法保證可以讀到剛剛寫入的值,除非使用了記憶體屏障或fence指令
出現這個情況的原因:
每個CPU核都有自己獨立的 cache 和 寄存器。
記憶體通路首先進入 cache 系統,所有修改預設會異步地重新整理到主存。
由于通路 cache 比通路主存要快得多,是以這樣的異步重新整理特性對于現代CPU的特性至關重要。
但,這就導緻出現了多個資料副本(一個主存,另外幾個在不同級别的 cache 中),而副本更新是異步方式,無法保證線性化
So,CAP 理論不适用與當今的多核-記憶體一緻性模型:在計算機内部,我們通常假設通訊是可靠的,即不會假定一個CPU核在與其他核斷開之後還能安然工作。
之是以放棄線性化(一緻性)的原因:性能,而不是為了容錯。
許多分布式資料庫也是類似,它們選擇不支援線性化是為了提高性能,而不是為了保住容錯性
三、凡凡認為
- CAP 好處在于:指明了方向或名額,提供了這個幾個角度,讓人們去思考自己的系統
- 若太看重 CAP,被這個框住,可能會忽略其他細節(故障)。
- 有時跳出架構,從其他角度去看待系統,可能會有另一番收獲。
- 理論應該成為我們的助推器,而不是限制器。
四、引用
- 《DDIA》
- 《從零開始學架構》