Java進階必備:優雅的告訴面試官消息中間件該如何實現高可用架構?【石杉的架構筆記】

歡迎關注我的公衆號:石杉的架構筆記(ID:shishan100)程序員

週一至週五早8點半!精品技術文章準時送上!面試

目錄

(1)背景引入算法

(2)先來思考一下消息中間件的可用性問題緩存

(3)集羣化部署 + 數據多副本冗餘性能優化

(4)多副本同步複製強制要求架構

(5)多機器承載多副本強制要求併發

(6)架構原理與技術無關性分佈式

(1)背景引入

這篇文章,咱們來聊一下消息中間件高可用架構的一些原理。微服務

對於一個合格的高級Java工程師而言,你確定會碰到在系統裏用到MQ的場景,那麼這個時候你須要基於你的業務場景和需求,考慮在使用MQ的時候可能遇到的一些技術問題。高併發

接着,你必須得針對這些技術問題設計一套完整的技術方案。

你須要從消息的訂閱模式、消息的生產到消費全鏈路不丟數據、消息中間件自己如何保證高可用,等各個角度切入,來考慮好你的系統和MQ對接以後的完整技術方案。

因此,本文就來聊聊消息中間件高可用的架構原理。

(2)先來思考一下消息中間件的可用性問題

我們先拋開各類具體的技術,就來思考一下,啥是MQ的可用性問題?

你們看看下面的圖,其實道理很簡單,假如你的MQ就部署在一臺機器上,那麼正常狀況下,生產者都會發送消息到MQ去,而後讓消費者獲取到。

可是萬一天有不測風雲,MQ部署的那臺機器,由於一些莫名的緣由,MQ本身自己的進程掛掉了,或者是那臺機器直接就宕機了,那麼此時怎麼辦呢?

很尷尬,是否是,結果是很明顯的,生產者無法發送數據出去,而後消費者也無法獲取到數據了。

而後整個系統不就完蛋了?由於系統的核心流程根本沒法跑通了,對不對?

MQ宕機就直接致使你的系統自己也故障了,而後可能會致使你的公司對外的APP、網站等產品就沒法運做了,用戶沒法使用大家公司的服務了。

若是大家公司是電商平臺、外賣平臺、社交平臺。那麼來這麼一出,不是會致使公司損失慘重?

若是你的系統持續幾個小時沒法被人使用,原本你公司電商平臺一天營收能夠達到1億,結果如今致使幾個小時內沒法下單購買商品,最後當天營收就5000萬,那麼你的公司是否是直接活生生損失了5000萬?

這個真的不是開玩笑的,若是你們留意互聯網行業的新聞的話和小道消息的話,就應該知道近幾年一些大型互聯網公司都出現過相似的狀況,損失慘重,我們作碼農的就得被祭天了是否是?

(3)集羣化部署 + 數據多副本冗餘

好,問題來了!如今你感受一個MQ中間件應該如何實現高可用呢?

這裏的方式有不少種,好比說數據多副本冗餘,集羣鏡像同步機制,咱們就拋開具體的技術來從本質層面思考一下MQ集羣實現高可用的幾種方式。

先來看下面的一張圖,假設咱們寫到MQ的數據都被多副本冗餘了,也就是你寫的每一條消息都被複制到了其餘的機器上去了。

那麼此時任何一臺機器宕機,彷佛都不會影響咱們跟MQ繼續通訊,並且寫出去的數據彷佛也都還在。

上面的圖裏,MQ採用集羣模式部署到了2臺機器上去,而後生產者給其中一臺機器寫入一條消息,該機器自動同步複製給另一臺機器。

此時數據在2臺機器上,就有2個副本了,那麼若是第一臺機器宕機了,會影響咱們嗎?

答案是:不會。

由於數據自己是多副本冗餘的,此時消費者徹底能夠從第二臺機器消費到這條消息,而且生產者還能夠繼續給第二臺機器寫入消息,數據沒丟失。

並且,系統根本不用中斷流程,還能夠繼續運行,咱們看下面的圖。

這種感受是否是很棒?實際上這種MQ集羣化部署架構以及數據多副本冗餘機制,是很是常見的一種高可用架構。

Kafka這個極爲優秀的消息中間件,就是採用的這種架構保證高可用、數據容錯性。

(4)多副本同步複製強制要求

可是這裏你要思考另外幾個問題,第一個就是:你在寫數據到其中一臺機器的時候,是否是得要求,必須得讓那臺機器複製數據到另一臺機器了,保證集羣裏必定有這條數據雙副本了,才能夠認爲本次寫成功了?

沒錯,假如你要是不能保證這一點,好比你就寫數據給了其中一臺機器,而後他還沒來得及複製給另一臺機器呢,直接第一臺機器就宕機了。

此時雖然你能夠繼續基於第二臺機器發送消息和消費消息,可是你剛纔發送的一條消息就丟失了。

你們看下面的圖來理解一下這個場景。

因此對於採用這種機制的時候,你必須得讓生產者經過一些參數的設置,保證說寫一條消息到某臺機器,他必須同步這條消息到另一臺機器成功,集羣裏有雙副本了,而後此時才能夠認爲這條消息寫成功了。

但凡剛寫一臺機器他就宕機,還沒來得及複製到另一臺機器的話,本次寫應該報錯失敗,而後你應該重試再次寫入數據到MQ集羣裏去。

你們看看下面的圖。只要你一次寫成功了,他就保證確定已經同步數據爲雙副本了,此時哪怕一臺機器宕機,數據不會丟失,生產和消費均可以有條不紊的繼續進行。

(5)多機器承載多副本強制要求

第二個問題,假如說如今你的集羣中原本有兩臺機器,如今宕機了其中的一臺,只有一臺機器了,你還能容許你的生產者對惟一的一臺機器繼續寫入數據嗎?

答案是:否。

由於若是集羣裏只有一臺機器能夠承載寫入,那麼萬一剩餘的一臺機器又宕機了呢?是否是仍是會致使數據丟失,集羣完蛋?

因此說,你的生產者同理應該基於參數設置一下,集羣裏必須有超過2臺機器能夠接收你的數據副本複製。

不然若是隻有1臺機器能夠接受你的數據副本複製的話,那麼仍是算了。

你們看看下面的圖,感覺一下那個場景。

假設集羣裏有3臺機器,那麼其中一臺宕機了,你後續再寫入另一臺的時候,判斷一下集羣裏還有剩餘兩臺機器,足以保證數據雙副本的高可用性和容錯性,因此能夠繼續正常的寫入數據到MQ集羣裏去。

實際上,上面說的那一整套的機制,在Kafka裏均可以採用,他有對應的一些參數能夠配置數據有幾個副本,包括你每次寫入必須複製到幾臺機器才能夠算成功,不然就要從新發送,以及你的集羣剩餘機器必須能夠承載幾個副本才能繼續寫入數據。

經過這一整套方案的設計和基於具體技術的落地,才能夠保證在集羣化部署的狀況下,集羣必須有幾臺機器承載多副本,同時數據寫入以後必須是保證多副本冗餘的。

此時,任何機器宕機,數據都不會丟失,還能夠正常讓系統繼續運行。

(6)架構原理與技術無關性

其實本文對消息中間件的集羣高可用架構的探討,是徹底脫離於某個具體技術的,很是樸素的從本質的原理層面來討論這個話題。

具體的RabbitMQ、Kafka、RocketMQ等各類不一樣的消息中間件,對這種高可用架構的實現,都有必定的類似想通性,可是也都有各自不一樣的技術實現,以及相對應的區別。

後面咱們再經過不一樣的文章,以各類MQ中間件的具體技術實現舉例來討論一下相關的架構是如何落地的。

END

若有收穫,請幫忙轉發,您的鼓勵是做者最大的動力,謝謝!

一大波微服務、分佈式、高併發、高可用的原創系列文章正在路上

歡迎掃描下方二維碼,持續關注:

石杉的架構筆記(id:shishan100)

十餘年BAT架構經驗傾囊相授

推薦閱讀:

一、拜託!面試請不要再問我Spring Cloud底層原理

二、【雙11狂歡的背後】微服務註冊中心如何承載大型系統的千萬級訪問?

三、【性能優化之道】每秒上萬併發下的Spring Cloud參數優化實戰

四、微服務架構如何保障雙11狂歡下的99.99%高可用

五、兄弟,用大白話告訴你小白都能聽懂的Hadoop架構原理

六、大規模集羣下Hadoop NameNode如何承載每秒上千次的高併發訪問

七、【性能優化的祕密】Hadoop如何將TB級大文件的上傳性能優化上百倍

八、拜託,面試請不要再問我TCC分佈式事務的實現原理!

九、【坑爹呀!】最終一致性分佈式事務如何保障實際生產中99.99%高可用?

十、拜託,面試請不要再問我Redis分佈式鎖的實現原理!

十一、【眼前一亮!】看Hadoop底層算法如何優雅的將大規模集羣性能提高10倍以上?

十二、億級流量系統架構之如何支撐百億級數據的存儲與計算

1三、億級流量系統架構之如何設計高容錯分佈式計算系統

1四、億級流量系統架構之如何設計承載百億流量的高性能架構

1五、億級流量系統架構之如何設計每秒十萬查詢的高併發架構

1六、億級流量系統架構之如何設計全鏈路99.99%高可用架構

1七、七張圖完全講清楚ZooKeeper分佈式鎖的實現原理

1八、大白話聊聊Java併發面試問題之volatile究竟是什麼?

1九、大白話聊聊Java併發面試問題之Java 8如何優化CAS性能?

20、大白話聊聊Java併發面試問題之談談你對AQS的理解?

2一、大白話聊聊Java併發面試問題之公平鎖與非公平鎖是啥?

2二、大白話聊聊Java併發面試問題之微服務註冊中心的讀寫鎖優化

2三、互聯網公司的面試官是如何360°無死角考察候選人的?(上篇)

2四、互聯網公司面試官是如何360°無死角考察候選人的?(下篇)

2五、Java進階面試系列之一:哥們,大家的系統架構中爲何要引入消息中間件?

2六、【Java進階面試系列之二】:哥們,那你說說系統架構引入消息中間件有什麼缺點?

2七、【行走的Offer收割機】記一位朋友斬獲BAT技術專家Offer的面試經歷

2八、【Java進階面試系列之三】哥們,消息中間件在大家項目裏是如何落地的?

2九、【Java進階面試系列之四】扎心!線上服務宕機時,如何保證數據100%不丟失?

30、一次JVM FullGC的背後,竟隱藏着驚心動魄的線上生產事故!

3一、【高併發優化實踐】10倍請求壓力來襲,你的系統會被擊垮嗎?

3二、【Java進階面試系列之五】消息中間件集羣崩潰,如何保證百萬生產數據不丟失?

3三、億級流量系統架構之如何在上萬併發場景下設計可擴展架構(上)?

3四、億級流量系統架構之如何在上萬併發場景下設計可擴展架構(中)?

3五、億級流量系統架構之如何在上萬併發場景下設計可擴展架構(下)?

3六、億級流量架構第二彈:你的系統真的無懈可擊嗎?

3七、億級流量系統架構之如何保證百億流量下的數據一致性(上)

3八、億級流量系統架構之如何保證百億流量下的數據一致性(中)?

3九、億級流量系統架構之如何保證百億流量下的數據一致性(下)?

40、互聯網面試必殺:如何保證消息中間件全鏈路數據100%不丟失(1)

4一、互聯網面試必殺:如何保證消息中間件全鏈路數據100%不丟失(2

4二、面試大殺器:消息中間件如何實現消費吞吐量的百倍優化?

4三、高併發場景下,如何保證生產者投遞到消息中間件的消息不丟失?

4四、兄弟,用大白話給你講小白都能看懂的分佈式系統容錯架構

4五、從團隊自研的百萬併發中間件系統的內核設計看Java併發性能優化

4六、【非廣告,純乾貨】英語差的程序員如何才能無障礙閱讀官方文檔?

4七、若是20萬用戶同時訪問一個熱點緩存,如何優化你的緩存架構?

做者:石杉的架構筆記 連接:juejin.im/post/5c263a… 來源:掘金 著做權歸做者全部,轉載請聯繫做者得到受權!

相關文章
相關標籤/搜索