差點(diǎn)跪了!阿里3面真題:CAP和BASE理論了解么?可以結(jié)合實(shí)際案例說下不?

本文節(jié)選自我開源的 JavaGuide :https://github.com/Snailclimb/JavaGuide (Github標(biāo)星92k+!一份涵蓋大部分 Java 程序員所需要掌握的核心知識。準(zhǔn)備 Java 面試,首選 JavaGuide!)

經(jīng)歷過技術(shù)面試的小伙伴想必對這個兩個概念已經(jīng)再熟悉不過了!

Guide哥當(dāng)年參加面試的時候,不夸張地說,只要問到分布式相關(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 猜想的時候,并沒有詳細(xì)定義 Consistency、Availability、Partition Tolerance 三個單詞的明確定義。

因此,對于 CAP 的民間解讀有很多,一般比較被大家推薦的是下面 ?? 這種版本的解。

在理論計(jì)算機(jī)科學(xué)中,CAP 定理(CAP theorem)指出對于一個分布式系統(tǒng)來說,當(dāng)設(shè)計(jì)讀寫操作時,只能能同時滿足以下三點(diǎn)中的兩個:

  • 一致性(Consistence) : 所有節(jié)點(diǎn)訪問同一份最新的數(shù)據(jù)副本
  • 可用性(Availability): 非故障的節(jié)點(diǎn)在合理的時間內(nèi)返回合理的響應(yīng)(不是錯誤或者超時的響應(yīng))。
  • 分區(qū)容錯性(Partition tolerance) : 分布式系統(tǒng)出現(xiàn)網(wǎng)絡(luò)分區(qū)的時候,仍然能夠?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ū)。

partition-tolerance

不是所謂的“3 選 2”

大部分人解釋這一定律時,常常簡單的表述為:“一致性、可用性、分區(qū)容忍性三者你只能同時達(dá)到其中兩個,不可能同時達(dá)到”。實(shí)際上這是一個非常具有誤導(dǎo)性質(zhì)的說法,而且在 CAP 理論誕生 12 年之后,CAP 之父也在 2012 年重寫了之前的論文。

當(dāng)發(fā)生網(wǎng)絡(luò)分區(qū)的時候,如果我們要繼續(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)。

為啥無同時保證 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)者只在啟動時與注冊中心交互,注冊中心不轉(zhuǎn)發(fā)請求,壓力較小。

常見的可以作為注冊中心的組件有:ZooKeeper、Eureka、Nacos...。

  1. ZooKeeper 保證的是 CP。 任何時刻對 ZooKeeper 的讀請求都能得到一致性的結(jié)果,但是, ZooKeeper 不保證每次請求的可用性比如在 Leader 選舉過程中或者半數(shù)以上的機(jī)器不可用的時候服務(wù)就是不可用的。
  2. Eureka 保證的則是 AP。 Eureka 在設(shè)計(jì)的時候就是優(yōu)先保證 A (可用性)。在 Eureka 中不存在什么 Leader 節(jié)點(diǎn),每個節(jié)點(diǎn)都是一樣的、平等的。因此 Eureka 不會像 ZooKeeper 那樣出現(xiàn)選舉過程中或者半數(shù)以上的機(jī)器不可用的時候服務(wù)就是不可用的情況。 Eureka 保證即使大部分節(jié)點(diǎn)掛掉也不會影響正常提供服務(wù),只要有一個節(jié)點(diǎn)是可用的就行了。只不過這個節(jié)點(diǎn)上的數(shù)據(jù)可能并不是最新的。
  3. Nacos 不僅支持 CP 也支持 AP。

總結(jié)

在進(jìn)行分布式系統(tǒng)設(shè)計(jì)和開發(fā)時,我們不應(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 了。這個時候,我們就可以同時保證 C 和 A 了。

總結(jié):如果系統(tǒng)發(fā)生“分區(qū)”,我們要考慮選擇 CP 還是 AP。如果系統(tǒng)沒有發(fā)生“分區(qū)”的話,我們要思考如何保證 CA 。

推薦閱讀

  1. CAP 定理簡化 (英文,有趣的案例)
  2. 神一樣的 CAP 理論被應(yīng)用在何方 (中文,列舉了很多實(shí)際的例子)
  3. 請停止呼叫數(shù)據(jù)庫 CP 或 AP (英文,帶給你不一樣的思考)

BASE 理論

BASE 理論起源于 2008 年, 由eBay的架構(gòu)師Dan Pritchett在ACM上發(fā)表。

簡介

BASEBasically 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ù)不可用或者不一致時,仍需要保持系統(tǒng)整體“主要可用”。

BASE 理論本質(zhì)上是對 CAP 的延伸和補(bǔ)充,更具體地說,是對 CAP 中 AP 方案的一個補(bǔ)充。

為什么這樣說呢?

CAP 理論這節(jié)我們也說過了:

如果系統(tǒng)沒有發(fā)生“分區(qū)”的話,節(jié)點(diǎn)間的網(wǎng)絡(luò)連接通信正常的話,也就不存在 P 了。這個時候,我們就可以同時保證 C 和 A 了。因此,如果系統(tǒng)發(fā)生“分區(qū)”,我們要考慮選擇 CP 還是 AP。如果系統(tǒng)沒有發(fā)生“分區(qū)”的話,我們要思考如何保證 CA 。

因此,AP 方案只是在系統(tǒng)發(fā)生分區(qū)的時候放棄一致性,而不是永遠(yuǎn)放棄一致性。在分區(qū)故障恢復(fù)后,系統(tǒng)應(yīng)該達(dá)到最終一致性。這一點(diǎn)其實(shí)就是 BASE 理論延伸的地方。

BASE 理論三要素

BASE理論三要素

1. 基本可用

基本可用是指分布式系統(tǒng)在出現(xiàn)不可預(yù)知故障的時候,允許損失部分可用性。但是,這絕不等價于系統(tǒng)不可用。

什么叫允許損失部分可用性呢?

  • 響應(yīng)時間上的損失: 正常情況下,處理用戶請求需要 0.5s 返回結(jié)果,但是由于系統(tǒng)出現(xiàn)故障,處理用戶請求的時間變?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ù)同步的過程存在延時。

3. 最終一致性

最終一致性強(qiáng)調(diào)的是系統(tǒng)中所有的數(shù)據(jù)副本,在經(jīng)過一段時間的同步后,最終能夠達(dá)到一個一致的狀態(tài)。因此,最終一致性的本質(zhì)是需要系統(tǒng)保證最終數(shù)據(jù)能夠達(dá)到一致,而不需要實(shí)時保證系統(tǒng)數(shù)據(jù)的強(qiáng)一致性。

分布式一致性的 3 種級別:

  1. 強(qiáng)一致性 :系統(tǒng)寫入了什么,讀出來的就是什么。

  2. 弱一致性 :不一定可以讀取到最新寫入的值,也不保證多少時間之后讀取到的數(shù)據(jù)是最新的,只是會盡量保證某個時刻達(dá)到數(shù)據(jù)一致的狀態(tài)。

  3. 最終一致性 :弱一致性的升級版。,系統(tǒng)會保證在一定時間內(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 面試手冊。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容