本文節(jié)選自我開源的 JavaGuide :https://github.com/Snailclimb/JavaGuide (Github標(biāo)星92k+!一份涵蓋大部分 Java 程序員所需要掌握的核心知識。準(zhǔn)備 Java 面試许起,首選 JavaGuideJ肌)
經(jīng)歷過技術(shù)面試的小伙伴想必對這個兩個概念已經(jīng)再熟悉不過了!
Guide哥當(dāng)年參加面試的時(shí)候园细,不夸張地說惦积,只要問到分布式相關(guān)的內(nèi)容,面試官幾乎是必定會問這兩個分布式相關(guān)的理論猛频。
并且狮崩,這兩個理論也可以說是小伙伴們學(xué)習(xí)分布式相關(guān)內(nèi)容的基礎(chǔ)了!
因此鹿寻,小伙伴們非常非常有必要將這理論搞懂厉亏,并且能夠用自己的理解給別人講出來。
這篇文章我會站在自己的角度對這兩個概念進(jìn)行解讀烈和!
個人能力有限爱只。如果文章有任何需要改善和完善的地方,歡迎在評論區(qū)指出招刹,共同進(jìn)步恬试!——愛你們的Guide哥
CAP理論
CAP 理論/定理起源于 2000年,由加州大學(xué)伯克利分校的Eric Brewer教授在分布式計(jì)算原理研討會(PODC)上提出疯暑,因此 CAP定理又被稱作 布魯爾定理(Brewer’s theorem)
2年后训柴,麻省理工學(xué)院的Seth Gilbert和Nancy Lynch 發(fā)表了布魯爾猜想的證明,CAP理論正式成為分布式領(lǐng)域的定理妇拯。
簡介
CAP 也就是 Consistency(一致性)幻馁、Availability(可用性)、Partition Tolerance(分區(qū)容錯性) 這三個單詞首字母組合越锈。
CAP 理論的提出者布魯爾在提出 CAP 猜想的時(shí)候仗嗦,并沒有詳細(xì)定義 Consistency、Availability甘凭、Partition Tolerance 三個單詞的明確定義稀拐。
因此,對于 CAP 的民間解讀有很多丹弱,一般比較被大家推薦的是下面 ?? 這種版本的解德撬。
在理論計(jì)算機(jī)科學(xué)中铲咨,CAP 定理(CAP theorem)指出對于一個分布式系統(tǒng)來說,當(dāng)設(shè)計(jì)讀寫操作時(shí)蜓洪,只能能同時(shí)滿足以下三點(diǎn)中的兩個:
- 一致性(Consistence) : 所有節(jié)點(diǎn)訪問同一份最新的數(shù)據(jù)副本
- 可用性(Availability): 非故障的節(jié)點(diǎn)在合理的時(shí)間內(nèi)返回合理的響應(yīng)(不是錯誤或者超時(shí)的響應(yīng))纤勒。
- 分區(qū)容錯性(Partition tolerance) : 分布式系統(tǒng)出現(xiàn)網(wǎng)絡(luò)分區(qū)的時(shí)候,仍然能夠?qū)ν馓峁┓?wù)隆檀。
什么是網(wǎng)絡(luò)分區(qū)摇天?
分布式系統(tǒng)中,多個節(jié)點(diǎn)之前的網(wǎng)絡(luò)本來是連通的刚操,但是因?yàn)槟承┕收希ū热绮糠止?jié)點(diǎn)網(wǎng)絡(luò)出了問題)某些節(jié)點(diǎn)之間不連通了闸翅,整個網(wǎng)絡(luò)就分成了幾塊區(qū)域再芋,這就叫網(wǎng)絡(luò)分區(qū)菊霜。
不是所謂的“3 選 2”
大部分人解釋這一定律時(shí),常常簡單的表述為:“一致性济赎、可用性鉴逞、分區(qū)容忍性三者你只能同時(shí)達(dá)到其中兩個,不可能同時(shí)達(dá)到”司训。實(shí)際上這是一個非常具有誤導(dǎo)性質(zhì)的說法构捡,而且在 CAP 理論誕生 12 年之后,CAP 之父也在 2012 年重寫了之前的論文壳猜。
當(dāng)發(fā)生網(wǎng)絡(luò)分區(qū)的時(shí)候勾徽,如果我們要繼續(xù)服務(wù),那么強(qiáng)一致性和可用性只能 2 選 1统扳。也就是說當(dāng)網(wǎng)絡(luò)分區(qū)之后 P 是前提喘帚,決定了 P 之后才有 C 和 A 的選擇。也就是說分區(qū)容錯性(Partition tolerance)我們是必須要實(shí)現(xiàn)的咒钟。
簡而言之就是:CAP 理論中分區(qū)容錯性 P 是一定要滿足的吹由,在此基礎(chǔ)上,只能滿足可用性 A 或者一致性 C朱嘴。
因此倾鲫,分布式系統(tǒng)理論上不可能選擇 CA 架構(gòu),只能選擇 CP 或者 AP 架構(gòu)萍嬉。
為啥無同時(shí)保證 CA 呢乌昔?
舉個例子:若系統(tǒng)出現(xiàn)“分區(qū)”,系統(tǒng)中的某個節(jié)點(diǎn)在進(jìn)行寫操作壤追。為了保證 C玫荣, 必須要禁止其他節(jié)點(diǎn)的讀寫操作,這就和 A 發(fā)生沖突了大诸。如果為了保證 A捅厂,其他節(jié)點(diǎn)的讀寫操作正常的話贯卦,那就和 C 發(fā)生沖突了。
選擇的關(guān)鍵在于當(dāng)前的業(yè)務(wù)場景焙贷,沒有定論撵割,比如對于需要確保強(qiáng)一致性的場景如銀行一般會選擇保證 CP 。
CAP 實(shí)際應(yīng)用案例
我這里以注冊中心來探討一下 CAP 的實(shí)際應(yīng)用辙芍》缺颍考慮到很多小伙伴不知道注冊中心是干嘛的,這里簡單以 Dubbo 為例說一說故硅。
下圖是 Dubbo 的架構(gòu)圖庶灿。注冊中心 Registry 在其中扮演了什么角色呢?提供了什么服務(wù)呢吃衅?
注冊中心負(fù)責(zé)服務(wù)地址的注冊與查找往踢,相當(dāng)于目錄服務(wù),服務(wù)提供者和消費(fèi)者只在啟動時(shí)與注冊中心交互徘层,注冊中心不轉(zhuǎn)發(fā)請求峻呕,壓力較小。
常見的可以作為注冊中心的組件有:ZooKeeper趣效、Eureka瘦癌、Nacos...。
- ZooKeeper 保證的是 CP跷敬。 任何時(shí)刻對 ZooKeeper 的讀請求都能得到一致性的結(jié)果讯私,但是, ZooKeeper 不保證每次請求的可用性比如在 Leader 選舉過程中或者半數(shù)以上的機(jī)器不可用的時(shí)候服務(wù)就是不可用的西傀。
- Eureka 保證的則是 AP斤寇。 Eureka 在設(shè)計(jì)的時(shí)候就是優(yōu)先保證 A (可用性)。在 Eureka 中不存在什么 Leader 節(jié)點(diǎn)池凄,每個節(jié)點(diǎn)都是一樣的抡驼、平等的。因此 Eureka 不會像 ZooKeeper 那樣出現(xiàn)選舉過程中或者半數(shù)以上的機(jī)器不可用的時(shí)候服務(wù)就是不可用的情況肿仑。 Eureka 保證即使大部分節(jié)點(diǎn)掛掉也不會影響正常提供服務(wù)致盟,只要有一個節(jié)點(diǎn)是可用的就行了。只不過這個節(jié)點(diǎn)上的數(shù)據(jù)可能并不是最新的尤慰。
- Nacos 不僅支持 CP 也支持 AP馏锡。
總結(jié)
在進(jìn)行分布式系統(tǒng)設(shè)計(jì)和開發(fā)時(shí),我們不應(yīng)該僅僅局限在 CAP 問題上伟端,還要關(guān)注系統(tǒng)的擴(kuò)展性杯道、可用性等等
在系統(tǒng)發(fā)生“分區(qū)”的情況下,CAP 理論只能滿足 CP 或者 AP责蝠。要注意的是党巾,這里的前提是系統(tǒng)發(fā)生了“分區(qū)”
如果系統(tǒng)沒有發(fā)生“分區(qū)”的話萎庭,節(jié)點(diǎn)間的網(wǎng)絡(luò)連接通信正常的話,也就不存在 P 了齿拂。這個時(shí)候驳规,我們就可以同時(shí)保證 C 和 A 了。
總結(jié):如果系統(tǒng)發(fā)生“分區(qū)”署海,我們要考慮選擇 CP 還是 AP吗购。如果系統(tǒng)沒有發(fā)生“分區(qū)”的話,我們要思考如何保證 CA 砸狞。
推薦閱讀
- CAP 定理簡化 (英文捻勉,有趣的案例)
- 神一樣的 CAP 理論被應(yīng)用在何方 (中文,列舉了很多實(shí)際的例子)
- 請停止呼叫數(shù)據(jù)庫 CP 或 AP (英文刀森,帶給你不一樣的思考)
BASE 理論
BASE 理論起源于 2008 年踱启, 由eBay的架構(gòu)師Dan Pritchett在ACM上發(fā)表。
簡介
BASE 是 Basically Available(基本可用) 撒强、Soft-state(軟狀態(tài)) 和 Eventually Consistent(最終一致性) 三個短語的縮寫禽捆。BASE 理論是對 CAP 中一致性 C 和可用性 A 權(quán)衡的結(jié)果笙什,其來源于對大規(guī)钠冢互聯(lián)網(wǎng)系統(tǒng)分布式實(shí)踐的總結(jié),是基于 CAP 定理逐步演化而來的琐凭,它大大降低了我們對系統(tǒng)的要求芽隆。
BASE 理論的核心思想
即使無法做到強(qiáng)一致性,但每個應(yīng)用都可以根據(jù)自身業(yè)務(wù)特點(diǎn)统屈,采用適當(dāng)?shù)姆绞絹硎瓜到y(tǒng)達(dá)到最終一致性胚吁。
也就是犧牲數(shù)據(jù)的一致性來滿足系統(tǒng)的高可用性,系統(tǒng)中一部分?jǐn)?shù)據(jù)不可用或者不一致時(shí)愁憔,仍需要保持系統(tǒng)整體“主要可用”腕扶。
BASE 理論本質(zhì)上是對 CAP 的延伸和補(bǔ)充,更具體地說吨掌,是對 CAP 中 AP 方案的一個補(bǔ)充半抱。
為什么這樣說呢?
CAP 理論這節(jié)我們也說過了:
如果系統(tǒng)沒有發(fā)生“分區(qū)”的話膜宋,節(jié)點(diǎn)間的網(wǎng)絡(luò)連接通信正常的話窿侈,也就不存在 P 了。這個時(shí)候秋茫,我們就可以同時(shí)保證 C 和 A 了史简。因此,如果系統(tǒng)發(fā)生“分區(qū)”肛著,我們要考慮選擇 CP 還是 AP圆兵。如果系統(tǒng)沒有發(fā)生“分區(qū)”的話跺讯,我們要思考如何保證 CA 。
因此殉农,AP 方案只是在系統(tǒng)發(fā)生分區(qū)的時(shí)候放棄一致性抬吟,而不是永遠(yuǎn)放棄一致性。在分區(qū)故障恢復(fù)后统抬,系統(tǒng)應(yīng)該達(dá)到最終一致性火本。這一點(diǎn)其實(shí)就是 BASE 理論延伸的地方。
BASE 理論三要素
1. 基本可用
基本可用是指分布式系統(tǒng)在出現(xiàn)不可預(yù)知故障的時(shí)候聪建,允許損失部分可用性钙畔。但是,這絕不等價(jià)于系統(tǒng)不可用金麸。
什么叫允許損失部分可用性呢擎析?
- 響應(yīng)時(shí)間上的損失: 正常情況下,處理用戶請求需要 0.5s 返回結(jié)果挥下,但是由于系統(tǒng)出現(xiàn)故障揍魂,處理用戶請求的時(shí)間變?yōu)?3 s。
- 系統(tǒng)功能上的損失:正常情況下棚瘟,用戶可以使用系統(tǒng)的全部功能现斋,但是由于系統(tǒng)訪問量突然劇增,系統(tǒng)的部分非核心功能無法使用偎蘸。
2. 軟狀態(tài)
軟狀態(tài)指允許系統(tǒng)中的數(shù)據(jù)存在中間狀態(tài)(CAP 理論中的數(shù)據(jù)不一致)庄蹋,并認(rèn)為該中間狀態(tài)的存在不會影響系統(tǒng)的整體可用性,即允許系統(tǒng)在不同節(jié)點(diǎn)的數(shù)據(jù)副本之間進(jìn)行數(shù)據(jù)同步的過程存在延時(shí)迷雪。
3. 最終一致性
最終一致性強(qiáng)調(diào)的是系統(tǒng)中所有的數(shù)據(jù)副本限书,在經(jīng)過一段時(shí)間的同步后,最終能夠達(dá)到一個一致的狀態(tài)章咧。因此倦西,最終一致性的本質(zhì)是需要系統(tǒng)保證最終數(shù)據(jù)能夠達(dá)到一致,而不需要實(shí)時(shí)保證系統(tǒng)數(shù)據(jù)的強(qiáng)一致性赁严。
分布式一致性的 3 種級別:
強(qiáng)一致性 :系統(tǒng)寫入了什么扰柠,讀出來的就是什么。
弱一致性 :不一定可以讀取到最新寫入的值误澳,也不保證多少時(shí)間之后讀取到的數(shù)據(jù)是最新的耻矮,只是會盡量保證某個時(shí)刻達(dá)到數(shù)據(jù)一致的狀態(tài)。
最終一致性 :弱一致性的升級版忆谓。裆装,系統(tǒng)會保證在一定時(shí)間內(nèi)達(dá)到數(shù)據(jù)一致的狀態(tài),
業(yè)界比較推崇是最終一致性級別,但是某些對數(shù)據(jù)一致要求十分嚴(yán)格的場景比如銀行轉(zhuǎn)賬還是要保證強(qiáng)一致性哨免。
總結(jié)
ACID 是數(shù)據(jù)庫事務(wù)完整性的理論茎活,CAP 是分布式系統(tǒng)設(shè)計(jì)理論,BASE 是 CAP 理論中 AP 方案的延伸琢唾。
圖解計(jì)算機(jī)基礎(chǔ)+個人原創(chuàng)的 Java 面試手冊PDF版载荔。
微信搜“JavaGuide”回復(fù)“計(jì)算機(jī)基礎(chǔ)”即可獲取圖解計(jì)算機(jī)基礎(chǔ)+個人原創(chuàng)的 Java 面試手冊。