CAP理論
全稱:Consistency & Availability & Partition tolerance,分别是一緻性、可用性、分區容忍性,這是分布式架構當中最基礎的理論。
以電商場景為案例幫助我們了解概念:
這是一個典型的讀寫分離場景

Consistency
一緻性是指寫操作後的讀操作可以讀取到最新的資料,當資料分布在多個節點,從任意節點讀取的到的資料都是最新的。
以上圖為例,商品資訊如果需要做一緻性保證的話,就要做滿足如下要求:
- 商品服務寫入主資料庫成功,向從資料庫的查詢也必須是最新的資料
- 商品服務吸入主資料庫失敗,從資料也不能查詢到新資料
如何保證一緻性:
- 寫入主資料後要保證資料能同步到從資料庫
- 當資料寫入主資料庫中之後,在資料向從資料庫同步的過程中,需要将從資料庫鎖定,待同步完成之後才能放開,以免出現資料寫入主資料庫之後,從資料庫查詢的還是舊資料
分布式系統實作一緻性的特點:
- 由于從在資料的同步過程,寫操作的響應會有一定的延遲
- 為了保證讀取資料時最新的,也就是保證一緻性,會對資源進行暫時的鎖定,待資料完成後釋放鎖定的資源
- 如果請求資料在同步資料的時間段内,則優雅的傳回錯誤資訊,但是一定不能傳回舊資料
Availability
可用性實質任何事務操作都可以的到響應結果,不會出現響應逾時或者相應錯誤,優先保證服務的正常進行。
以上圖為例,商品資訊如果需要滿足可用性的話,就要做滿足如下要求:
- 從資料庫接收到資料查詢的請求,要立即能夠響應資料查詢結果,即使是舊資料
- 讀取從資料不允許出現響應逾時或者響應失敗
如何保證可用性:
- 寫入主資料庫後一定要保證将資料同步到從資料
- 由于要保證從資料的讀取不能出現響應逾時或者響應失敗,不能将從資料庫中的資源鎖定
- 即使資料沒有同步完成,從資料庫的讀取也要能傳回查詢結果,即使是舊資料,如果連舊資料都沒有,則要傳回一個優雅的預設資訊,堅決不能出現響應逾時或者響應失敗
分布式系統可用性的特點:
- 所有請求都有響應,優先保證資料的傳回,不會出現響應逾時或者傳回錯誤
Partition tolerance
通常分布式系統的各個節點都部署在不同的子網(各地伺服器),這就是網絡分區,難免會出現由于網絡問題導緻的節點間通信失敗,此時系統仍然要能夠堆外提供服務,這就是分區容忍性。
以上圖為例,商品資訊如果需要滿足分區容忍性的話,就要做滿足如下要求:
- 主資料庫向從資料庫同部資料失敗不影響讀寫操作(也就是即使同步失敗,仍然能保證主資料庫的寫操作和從資料庫的讀請求)
- 其中一個節點挂掉不影響其他節點堆外服務
如何實作分區容忍性:
- 盡量使用異步架構取代同步操作,實作松耦合,不能因為一個業務調用鍊中的某一個節點異常,導緻主業務操作失敗。
- 盡量增加各個節點的執行個體,多主多從,保證每一個節點中一定有活着的服務
分區容忍性是分布式系統的基本能力
CAP的組合方式
所有分布式事務場景中不會同時具備CAP三個特性,由之前CAP介紹中可知,C和A是沖突的不能共存的,P是最基本的能力。
AP
放棄一緻性,追求分區容忍性和可用性,這是大多數場景下分布式系統設計的選擇。
例如:
- 訂單退款,退款成功了,但是錢會在幾個工作日内到賬,這個過程其實就是放棄了一緻性,追求可用性
- 電商網站商品釋出,雖然商品已經釋出成功了,但是由于資料同步或者是緩存沒有及時更新,商品清單可能要過幾十秒甚至幾分鐘才能重新整理出新的商品
CP
放棄可用性,追求強一緻性和分區容忍性,分布式系統中經常用到的代表中間件zookeeper就是最求強一緻的代表
例如:
- 銀行轉賬,隻要提示轉賬成功,那該次轉賬操作一定是完成的(現在注意到手機銀行轉賬已經是2PC模式了QAQ)
CA
放棄容忍性,即不進行分區,隻滿足一緻性和可用性。實際上這已經是一種垂直架構了,沒有分布式的特性了。
不采用主從資料庫,資料庫可以響應每次查詢請求,通過事務隔離級别實作每個查詢都可以傳回最新的資料。
總結
CAP是一個已經被證明的理論:一個分布式系統系統最多同時能滿足一緻性、可用性、分區容忍性的兩種(其實CA沒有P不算是分布式),可以作為架構設計的、技術選型的基礎考量标準。對于現在大多數網際網路應用場景,結合衆多、部署分布,而且現在的叢集規模越來越大,是以節點故障、網絡故障是常态,要保證服務的高可用的同時,并要達到良好的響應性能,是以一般都會選擇AP。