一、CAP理論
CAP是Consistency、Avaliability、Partitiontolerance三個詞語的縮寫,分别表示一緻性、可用性、分區容忍性。
為了友善對CAP理論的了解,我們結合電商系統中的一些業務場景來了解CAP,如下圖,是商品資訊管理的執行流程:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBHL0FWby9mZvwVZnFWbp1zczV2YvJHctM3cv1Ce-EEROJDOTFVYahVZ4VkbU1UMFJWasdkY0UkbaNlRqFlMnt2Y4FFWWxEaENFdwNjVwQmbZhlTspFewU0UQRmMNdnSUFVRWFjWXh3VapGbXNlNWtWVqRnMjZHZu5Ed0d1TX5EbZBnUrNVNSV1YWlzVWlkRUJ2RSpnVJ5EVNFVO5pVdCNDW2wWbZRXMywUdO1GTqx2RjhXNpVGcKdlY0lTeMZTTINGMShUYvwlbj5yZtlmbkN3YuQnclZnbvN2Ztl2Lc9CX6MHc0RHaiojIsJye.jpg)
執行流程如下:
(1)商品請求主資料庫寫入商品資訊(添加商品、修改商品、删除商品);
(2)主資料庫向商品服務響應寫入成功;
(3)商品服務請求從資料庫讀取商品資訊;
1.1 C - 一緻性
一緻性是寫操作後的讀操作可以讀取到最新的資料狀态,當資料分布在多個節點時,從任意節點讀取到的資料都是最新的狀态。
上圖中,商品資訊的讀寫要滿足一緻性就是要實作如下目标:
(1)商品服務寫入主資料庫成功,則向從資料庫查詢新資料也成功。
(2)商品服務寫入主資料庫失敗,則向從資料庫查詢新資料也失敗。
如何實作一緻性?
(1)寫入主資料庫後要将資料同步到從資料庫。
(2)寫入主資料庫後,在向從資料庫同步期間要将從資料庫鎖定,待同步完成後再釋放鎖,以免在新資料庫寫入成功後,向從資料庫查詢到舊的資料。
分布式一緻性的特點:
(1)由于存在資料同步的過程,寫操作的相應會有一定延遲。
(2)為了保證資料一緻性會對資源暫時鎖定,待資料同步完成釋放鎖定資源。
(3)如果請求資料同步失敗的節點則會傳回錯誤資訊,一定不會傳回舊資訊。
1.2 A – 可用性
可用性是指任何事務操作都可以得到相應結果,且不會出現響應逾時或響應錯誤。
上圖中,商品資訊的讀取要滿足可用性就是要實作如下目标:
(1)從資料庫接收到查詢的請求則立即能夠響應資料查詢結果。
(2)從資料庫查詢不允許出現響應逾時或者響應錯誤。
如何實作可用性?
(1)寫入主資料庫要将資料同步到從資料庫。
(2)由于要保證從資料庫的可用性,不可将從資料庫中的資源鎖定。
(3)即時資料還沒有同步過來,從資料庫也要傳回要查詢的資料,哪怕是舊資料,如果連舊資料也沒有則可以按照約定傳回一個預設資訊,但不能傳回錯誤或相應逾時。
分布式系統可用性的特點:
(1)所有請求都有響應,且不會出現響應逾時或者響應錯誤。
1.3 P – 分區容忍性
通常分布式系統的各個節點部署在不同的子網,這就是網絡分區,不可避免的會出現由于網絡問題而導緻節點之間通信失敗,此時仍可對外提供服務,這叫分區容忍性。
上圖中,商品資訊讀寫要滿足分區容忍性就是要實作如下目标:
(1)主資料向從資料庫同步資料失敗不影響讀寫操作。
(2)一個節點挂掉不影響另一個節點對外提供服務。
如何實作分區容忍性?
(1)盡量使用異步取代同步操作,例如使用異步方式将資料從主資料庫同步到從資料庫,這樣節點之間有效的實作松耦合。
(2)添加從資料庫節點,其中一個節點挂掉其它節點提供服務。
分布式分區容忍性的特點:
(1)分區容忍性是分布式系統具備的基本能力。
二、CAP組合方式
在所有的分布式事務場景中不會同時具備CAP三個特性,因為在具備了P的前提下C和A是不能共存的。
下圖滿足了P即表示實作了分區容忍性:
分區容忍的含義:
(1)主資料庫通過網絡向從資料庫同步資料,可以認為主從資料庫部署在不同的分區上,通過網絡進行互動。
(2)當主資料庫和從資料庫之間的網絡出現問題不影響主資料庫和從資料庫對外提供服務。
(3)其一個節點挂掉不影響另一個節點對外提供服務。
如果要實作C則必須保證資料一緻性,在資料同步的時候為防止向從資料庫查詢的不一緻則需要從資料庫鎖定,待完成同步之後解鎖,如果同步失敗從資料庫要傳回錯誤資訊或逾時資訊。
如果要實作A則必須保證資料可用性,不管任何時候都可以向從資料庫進行查詢資料,并且不能夠傳回錯誤資訊或者逾時資訊
通過分析在滿足P的前提下,C和A存在沖突。
是以在生産中對分布式事務處理時需要根據需求來确定滿足CAP的哪兩個方面。
1.1 CA組合
CA組合就是保證一緻性和可用性,放棄分區容忍性,即不進行分區,不考慮由于網絡不通或節點挂掉的問題。那麼系統将不是一個标準的分布式系統,我們最常用的關系型資料庫就滿足了CA。
1.2 CP組合
CP組合就是保證一緻性和分區容忍性,放棄可用性。Zookerper就是追求強一緻性,放棄了可用性,還有跨行轉賬,一次轉賬請求要等待雙方銀行系統都完成整個事務才能完成。
1.3 AP組合
AP組合就是保證可用性和分區容忍性,放棄一緻性。這是分布式系統設計時的選擇。
三、小結
CAP是一個已經證明的理論:一個分布式系統做多隻能滿足CAP中的兩項,為達到良好的響應性能來提高使用者體驗,是以一般會做出如下選擇:保證A和P,舍棄C強一緻性,保證最終一緻性。