概述
CAP原則又稱CAP定理,指的是在一個分布式系統(tǒng)中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分區(qū)容錯性),三者不可得兼,通常只能取其二。
- C(一致性):在分布式系統(tǒng)中所有的數(shù)據(jù)備份,在同一時刻是否有同樣的值。
- A(可用性):好的響應性能。
- P(分區(qū)容錯性):在網(wǎng)絡上有部分消息丟失,系統(tǒng)是否能正常運行。
例如: - CA without P
單節(jié)點關系型數(shù)據(jù)庫,不具備分區(qū)容錯性,顯然一旦單個節(jié)點掛掉,整個數(shù)據(jù)庫系統(tǒng)就全掛掉。但是卻擁有一致性和可用性,單點數(shù)據(jù)庫對事務的支持,以及多表關聯(lián)是非常容易實現(xiàn)的。 - CP without A
在分布式環(huán)境下,為了確保一致性,往往會導致可用性降低。例如service A 和 service B為了確保一致性,會使用到分布式事務或者分布式鎖,這些操作會導致處理時間加長,而這些service的分區(qū)更會加重這種情況。
例如zookeeper,可以實現(xiàn)集群,具備P,為了強一致性,zookeeper會兩兩通信,保證數(shù)據(jù)一致。當集群節(jié)點少的情況下,性能尚能接受,但是在節(jié)點數(shù)量龐大的情況下,zookeeper為了保證強一致性會導致很多的資源消耗,導致可用性嚴重降低。 - AP without C
在某些業(yè)務場景下,為了高可用性,則需放棄一致性。一旦分區(qū)發(fā)生錯誤,節(jié)點之間會失去聯(lián)系,為了不影響服務的響應時間,節(jié)點使用本地數(shù)據(jù)服務,這樣會導致各節(jié)點數(shù)據(jù)不一致。
例如:eureka,與zookeeper思路相反,為了保證高可用,放棄一致性。
與CAP理論相似或者相關的還有ACID和BASE理論。
ACID:
- Atomicity原子性:一個事務中所有操作都必須全部完成,要么全部不完成。
- Consistency一致性. 在事務開始或結束時,數(shù)據(jù)庫應該在一致狀態(tài)。
- Isolation隔離層. 事務將假定只有它自己在操作數(shù)據(jù)庫,彼此不知曉。
- Durability持久性:一旦事務完成,就不能返回。
這個理論主要運用在了關系型數(shù)據(jù)庫,但是分區(qū)復雜度高。
BASE
BASE是Basically Available(基本可用)、Soft state(軟狀態(tài))和Eventually consistent(最終一致性)三個短語的縮寫。BASE理論是對CAP中一致性和可用性權衡的結果,其來源于對大規(guī)?;ヂ?lián)網(wǎng)系統(tǒng)分布式實踐的總結, 是基于CAP定理逐步演化而來的。該理論允許一段時間內(nèi)的狀態(tài)不一致,比如在某app上購物,發(fā)起第三方支付,用戶支付狀態(tài)不可能立即同步到數(shù)據(jù)庫。如果支付成功,第三方會調(diào)用回調(diào)接口或者app主動查詢來完成狀態(tài)一致,這就是一個典型的最終一致的場景。雖然有短暫的數(shù)據(jù)不一致,但是大多數(shù)系統(tǒng)下,完成這個數(shù)據(jù)一致校正是非常快的,使用戶察覺不到這個過程。
總結:在結合業(yè)務的情況下,設計人員總會再CAP中做出些角色,取其二以滿足業(yè)務系統(tǒng)的需求。
ps: 如有錯誤,或者理解不到位的地方,歡迎大家對我指摘。謝謝。