java分布式面試CAP分別代表含義分析
引言
上一節(jié)講面試中被問到分布式系統(tǒng)概念相關(guān)的,講完了分布式系統(tǒng)的概念,優(yōu)點缺點和 RPC 后,我以為這個問題就到此結(jié)束了,沒想到成功給自己挖了個坑(微笑臉),關(guān)于 CAP,以前只是聽說過,并沒有詳細點整理過,這一次問好好整理了下。
CAP 問題已經(jīng)成了計算機科學(xué)中一個研究領(lǐng)域,之前說到分布式系統(tǒng)有哪些優(yōu)勢時講到三個提升:
1. 系統(tǒng)可用性提升。
2. 系統(tǒng)并發(fā)能力提升。
3. 系統(tǒng)容錯能力提升。
那么這三方面在實施起來可以同時滿足嗎?答案是不能,設(shè)計分布式系統(tǒng)的時候,設(shè)計者需要理解一個重要的理論概念,CAP 定理。
1、面試官,說到 CAP 定理,那能詳細說說 CAP 分別代表什么嗎?
問題分析:一個很經(jīng)典的概念性面試題。
答:關(guān)于 CAP,它是 2000 年 7 月,加州大學(xué)伯克利分校的 Eric Brewer 教授在 ACM PODC 會議上提出 CAP 猜想。2 年后,麻省理工學(xué)院的 Seth Gilbert 和 Nancy Lynch 從理論上證明了 CAP。之后,CAP 理論正式成為分布式計算領(lǐng)域的公認定理。
C 的全拼是 Consistency,代表 一致性的意思。
A 的全拼是 Availability,代表 可用性的意思。
P 的全拼是 Partition tolerance,代表 分區(qū)容錯性的意思。
2、面試官:聽起來很簡單,這只是概念,但是具體是什么意思呢?
問題分析:下次這種問題不能等面試官來問了,這面試有點擠牙膏的感覺,不如我一次說完,讓面試官閉嘴。
答:一個分布式系統(tǒng)最多同時滿足一致性 (Consistency),可用性 (Availability) 和分區(qū)容忍性 (Partition Tolerance) 這三項中的兩項。
- 同時滿足一致性(C)和可用性(A)就要犧牲掉容錯性(P)
- 同時滿足可用性(A)和分區(qū)容錯性(P)就要犧牲掉一致性(C)
- 同時滿足一致性(C)和分區(qū)容錯性(P)就要犧牲掉可用性(A)
(開始拿起紙筆畫了三個圈圈)
這三個象限,只能同時滿足其中兩個圓圈的交集。
面試官:行了行了,這個理論性的問題就到這,時間有限,我們聊點別的。
舉例深入分析
用 Redis Cluster 高可用架構(gòu)舉例:Redis 就能會將數(shù)據(jù)分片到多個實例 (按照 slot 存儲) 中,即一個機房分擔一部分數(shù)據(jù)。Master 負責寫,Master 會自動同步到 Slave。
Redis 去中心集群架構(gòu)優(yōu)點:
1. 無中心架構(gòu):三機房部署,其中一主一從構(gòu)成一個分片,之間通過異步復(fù)制同步數(shù)據(jù),異步復(fù)制存在數(shù)據(jù)不一致的時間窗口,保證高性能的同時犧牲了部分一致性。一旦某個機房掉線,則分片上位于另一個機房的 slave 會被提升為 master 從而可以繼續(xù)提供服務(wù)。
2. 可擴展性:可線性擴展到 1000 多個節(jié)點,節(jié)點可動態(tài)添加或刪除。
3. 降低運維成本,提高系統(tǒng)的擴展性和可用性。
分析,這個分布式架構(gòu)中滿足了 CAP 中哪個兩個定理?
優(yōu)點 1 中講到,三機房部署,每個機房有一主一從,即一個 Master 對應(yīng)一個 Slave ,但是你會發(fā)現(xiàn),機房 1 中的 Master 1 連接的 Slave 在機房 2,機房 2 中的 Master 2 連接的 Slave 在機房 3,機房 3 中的 Master 3 連接的 Slave 在機房 1,這樣構(gòu)成一個環(huán),為什么要這樣設(shè)計?
假設(shè):機房斷電 or 火災(zāi) or 其他各種原因,反正就是機房 1 所有機器都不能用了。
這個時候那機房 1 的全部數(shù)據(jù)都不能訪問了嗎?這顯然是我們不希望的。前面已經(jīng)說了 Master 負責寫,Master 會自動同步到 Slave,如果 Master 寫服務(wù)宕機,Slave 讀服務(wù)會被提升為 Master ,也就是說機房 1 的數(shù)據(jù)在機房 2 的 Slave2 上還有備份,數(shù)據(jù)還在,在宕機的 Master 沒有恢復(fù)前 Slave 要同時承擔讀寫服務(wù),雖然累一點,但是還能用,這樣設(shè)計是為了提高可用性(A),和容錯性(P)。系統(tǒng)準許你一臺機器或者整個機房都宕機,系統(tǒng)仍然能用。
但是你會發(fā)現(xiàn),單個機房如果距離很遠, Master 1 的數(shù)據(jù)同步到 Slave2 上是跨機房,跨機房同步肯定不如同機房塊,這樣一來 Slave2 負責的讀就會有延遲,Master1 要更新的數(shù)據(jù)還沒有同步到他在另一個機房的備份前,讀操作就是不一致的,這樣設(shè)計顯然是犧牲掉一致性(C)。相信這樣分析應(yīng)該能理解 CAP 定理了。
進一步分析:
讓同一組 Master - Slave 放在一個機房,同機房復(fù)制數(shù)據(jù)不是更快?這樣能不能解決數(shù)據(jù)一致(C)問題,答案是能,還有更好的解決一致性的辦法就是不要 Master - Slave 組合,就一臺機器,一臺機器同時擔任讀寫請求,沒有延遲不存在數(shù)據(jù)一致性問題。這是時候如果宕機了怎么辦?這樣的架構(gòu)下,那就真的是不可用了,解決了一致性(C)卻犧牲了可用性(A)和容錯性(P),太不劃算了。
總之,分布式系統(tǒng)下,CAP 確實無法同時滿足,在 Redis 去中心集群架構(gòu)中,最優(yōu)的解決方案還是滿足可用性(A)和分區(qū)容錯性(P)就要犧牲掉一致性(C),即使跨機房同步數(shù)據(jù),延遲也不過 1s,數(shù)據(jù)不一致的問題只出現(xiàn)在 1s 內(nèi),日常開發(fā)中,很少遇到要求強一致性的場景。例如訂單系統(tǒng),用戶更新了訂單支付狀態(tài),讀訂單狀態(tài)是在從庫,有什么讀場景等不來這一秒?
如果真的必須要求強一致性,那可能就必須調(diào)整分布式架構(gòu)方案來。
總結(jié)
本文主要講解了 CAP 定理的概念,為什么要學(xué)習(xí)這個概念,設(shè)計高可用分布式系統(tǒng)時,你必須知道系統(tǒng)的短處,懂得 CAP 能讓你根據(jù)實際情況有舍有得。面試會被經(jīng)常問到,比如,你說你使用了消息隊列,解決了系統(tǒng)耦合問題,提高了響應(yīng)速度,那面試官問題:使用消息隊列有啥缺點?如果你知道 CAP 定理這個問題還難嗎?
顯然消息的延遲會帶來數(shù)據(jù)不一致問題。理想情況下消息不丟失那數(shù)據(jù)會最終一致,你能保證消息不丟失嗎?如何解決機問題,如果是我,我會選擇 “最終一致性”,就是說不管消息延遲多久甚至丟失,設(shè)計一個離線定時任務(wù),定期去掃描兩個系統(tǒng)的數(shù)據(jù),有不一致的情況就主動刷新同步,這樣保證最終一致。
以上就是java分布式面試CAP分別代表含義分析的詳細內(nèi)容,更多關(guān)于java分布式面試CAP含義的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
用Rational Rose逆向工程(java)生成類圖(教程和錯誤解決)
Rational Rose有個很方便的功能,將項目中的JAVA代碼自動轉(zhuǎn)換成UML類圖2013-02-02java實現(xiàn)一個簡單TCPSocket聊天室功能分享
這篇文章主要為大家分享了java實現(xiàn)的一個簡單TCPSocket聊天室功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-04-04SpringBoot--Banner的定制和關(guān)閉操作
這篇文章主要介紹了SpringBoot--Banner的定制和關(guān)閉操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2018-05-05Java實現(xiàn)調(diào)用對方http接口得到返回數(shù)據(jù)
這篇文章主要介紹了Java實現(xiàn)調(diào)用對方http接口得到返回數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09Spring中的@Conditional注解實現(xiàn)分析
這篇文章主要介紹了Spring中的@Conditional注解實現(xiàn)分析, @Conditional是Spring 4出現(xiàn)的注解,但是真正露出價值的是Spring Boot的擴展@ConditionalOnBean等,需要的朋友可以參考下2023-12-12Spring boot項目使用thymeleaf模板過程詳解
這篇文章主要介紹了Spring boot項目使用thymeleaf模板過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07