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

石杉的架構筆記發表於2019-01-23

歡迎關注個人公眾號:石杉的架構筆記(ID:shishan100)

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

目錄

(1)背景引入

(2)先來思考一下訊息中介軟體的可用性問題

(3)叢集化部署 + 資料多副本冗餘

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

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

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

(1)背景引入

這篇文章,我們來聊一下訊息中介軟體高可用架構的一些原理。

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

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

你需要從訊息的訂閱模式、訊息的生產到消費全鏈路不丟資料、訊息中介軟體本身如何保證高可用,等各個角度切入,來考慮好你的系統和MQ對接之後的完整技術方案。

所以,本文就來聊聊訊息中介軟體高可用的架構原理。

(2)先來思考一下訊息中介軟體的可用性問題

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

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

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

但是萬一天有不測風雲,MQ部署的那臺機器,因為一些莫名的原因,MQ自己本身的程式掛掉了,或者是那臺機器直接就當機了,那麼此時怎麼辦呢?

很尷尬,是不是,結果是很明顯的,生產者沒法傳送資料出去,然後消費者也沒法獲取到資料了。

然後整個系統不就完蛋了?因為系統的核心流程根本無法跑通了,對不對?

MQ當機就直接導致你的系統本身也故障了,然後可能會導致你的公司對外的APP、網站等產品就無法運作了,使用者無法使用你們公司的服務了。

如果你們公司是電商平臺、外賣平臺、社交平臺。那麼來這麼一出,不是會導致公司損失慘重?

如果你的系統持續幾個小時無法被人使用,本來你公司電商平臺一天營收可以達到1億,結果現在導致幾個小時內無法下單購買商品,最後當天營收就5000萬,那麼你的公司是不是直接活生生損失了5000萬?

這個真的不是開玩笑的,如果大家留意網際網路行業的新聞的話和小道訊息的話,就應該知道近幾年一些大型網際網路公司都出現過類似的情況,損失慘重,我們們做碼農的就得被祭天了是不是?

(3)叢集化部署 + 資料多副本冗餘

好,問題來了!現在你感覺一個MQ中介軟體應該如何實現高可用呢?

這裡的方式有很多種,比如說資料多副本冗餘,叢集映象同步機制,我們就拋開具體的技術來從本質層面思考一下MQ叢集實現高可用的幾種方式。

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

那麼此時任何一臺機器當機,似乎都不會影響我們跟MQ繼續通訊,而且寫出去的資料似乎也都還在。

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

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

此時資料在2臺機器上,就有2個副本了,那麼如果第一臺機器當機了,會影響我們嗎?

答案是:不會。

因為資料本身是多副本冗餘的,此時消費者完全可以從第二臺機器消費到這條訊息,並且生產者還可以繼續給第二臺機器寫入訊息,資料沒丟失。

而且,系統根本不用中斷流程,還可以繼續執行,我們看下面的圖。

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

這種感覺是不是很棒?實際上這種MQ叢集化部署架構以及資料多副本冗餘機制,是非常常見的一種高可用架構。

Kafka這個極為優秀的訊息中介軟體,就是採用的這種架構保證高可用、資料容錯性。

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

但是這裡你要思考另外幾個問題,第一個就是:你在寫資料到其中一臺機器的時候,是不是得要求,必須得讓那臺機器複製資料到另外一臺機器了,保證叢集裡一定有這條資料雙副本了,才可以認為本次寫成功了?

沒錯,假如你要是不能保證這一點,比如你就寫資料給了其中一臺機器,然後他還沒來得及複製給另外一臺機器呢,直接第一臺機器就當機了。

此時雖然你可以繼續基於第二臺機器傳送訊息和消費訊息,但是你剛才傳送的一條訊息就丟失了。

大家看下面的圖來理解一下這個場景。

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

所以對於採用這種機制的時候,你必須得讓生產者通過一些引數的設定,保證說寫一條訊息到某臺機器,他必須同步這條訊息到另外一臺機器成功,叢集裡有雙副本了,然後此時才可以認為這條訊息寫成功了。

但凡剛寫一臺機器他就當機,還沒來得及複製到另外一臺機器的話,本次寫應該報錯失敗,然後你應該重試再次寫入資料到MQ叢集裡去。

大家看看下面的圖。只要你一次寫成功了,他就保證肯定已經同步資料為雙副本了,此時哪怕一臺機器當機,資料不會丟失,生產和消費都可以有條不紊的繼續進行。

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

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

第二個問題,假如說現在你的叢集中本來有兩臺機器,現在當機了其中的一臺,只有一臺機器了,你還能允許你的生產者對唯一的一臺機器繼續寫入資料嗎?

答案是:否。

因為如果叢集裡只有一臺機器可以承載寫入,那麼萬一剩餘的一臺機器又當機了呢?是不是還是會導致資料丟失,叢集完蛋?

所以說,你的生產者同理應該基於引數設定一下,叢集裡必須有超過2臺機器可以接收你的資料副本複製。

否則如果只有1臺機器可以接受你的資料副本複製的話,那麼還是算了。

大家看看下面的圖,感受一下那個場景。

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

假設叢集裡有3臺機器,那麼其中一臺當機了,你後續再寫入另外一臺的時候,判斷一下叢集裡還有剩餘兩臺機器,足以保證資料雙副本的高可用性和容錯性,所以可以繼續正常的寫入資料到MQ叢集裡去。

實際上,上面說的那一整套的機制,在Kafka裡都可以採用,他有對應的一些引數可以配置資料有幾個副本,包括你每次寫入必須複製到幾臺機器才可以算成功,否則就要重新傳送,以及你的叢集剩餘機器必須可以承載幾個副本才能繼續寫入資料。

通過這一整套方案的設計和基於具體技術的落地,才可以保證在叢集化部署的情況下,叢集必須有幾臺機器承載多副本,同時資料寫入之後必須是保證多副本冗餘的。

此時,任何機器當機,資料都不會丟失,還可以正常讓系統繼續執行。

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

其實本文對訊息中介軟體的叢集高可用架構的探討,是完全脫離於某個具體技術的,非常樸素的從本質的原理層面來討論這個話題。

具體的RabbitMQ、Kafka、RocketMQ等各種不同的訊息中介軟體,對這種高可用架構的實現,都有一定的相似想通性,但是也都有各自不同的技術實現,以及相對應的區別。

後面我們再通過不同的文章,以各種MQ中介軟體的具體技術實現舉例來討論一下相關的架構是如何落地的。

END

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

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

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

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

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

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

推薦閱讀:

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

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

3、【效能優化之道】每秒上萬併發下的Spring Cloud引數優化實戰

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

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

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

7、【效能優化的祕密】Hadoop如何將TB級大檔案的上傳效能優化上百倍

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

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

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

11、【眼前一亮!】看Hadoop底層演算法如何優雅的將大規模叢集效能提升10倍以上?

12、億級流量系統架構之如何支撐百億級資料的儲存與計算

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

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

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

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

17、七張圖徹底講清楚ZooKeeper分散式鎖的實現原理

18、大白話聊聊Java併發面試問題之volatile到底是什麼?

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

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

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

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

23、網際網路公司的面試官是如何360°無死角考察候選人的?(上篇)

24、網際網路公司面試官是如何360°無死角考察候選人的?(下篇)

25、Java進階面試系列之一:哥們,你們的系統架構中為什麼要引入訊息中介軟體?

26、【Java進階面試系列之二】:哥們,那你說說系統架構引入訊息中介軟體有什麼缺點?

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

28、【Java進階面試系列之三】哥們,訊息中介軟體在你們專案裡是如何落地的?

29、【Java進階面試系列之四】扎心!線上服務當機時,如何保證資料100%不丟失?

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

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

32、【Java進階面試系列之五】訊息中介軟體叢集崩潰,如何保證百萬生產資料不丟失?

33、億級流量系統架構之如何在上萬併發場景下設計可擴充套件架構(上)?

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

35、億級流量系統架構之如何在上萬併發場景下設計可擴充套件架構(下)?

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

37、億級流量系統架構之如何保證百億流量下的資料一致性(上)

38、億級流量系統架構之如何保證百億流量下的資料一致性(中)?

39、億級流量系統架構之如何保證百億流量下的資料一致性(下)?

40、網際網路面試必殺:如何保證訊息中介軟體全鏈路資料100%不丟失(1)

41、網際網路面試必殺:如何保證訊息中介軟體全鏈路資料100%不丟失(2

42、面試大殺器:訊息中介軟體如何實現消費吞吐量的百倍優化?

43、高併發場景下,如何保證生產者投遞到訊息中介軟體的訊息不丟失?

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

45、從團隊自研的百萬併發中介軟體系統的核心設計看Java併發效能優化

46、【非廣告,純乾貨】英語差的程式設計師如何才能無障礙閱讀官方文件?

47、如果20萬使用者同時訪問一個熱點快取,如何優化你的快取架構?

作者:石杉的架構筆記 連結:juejin.im/post/5c263a… 來源:掘金 著作權歸作者所有,轉載請聯絡作者獲得授權!

相關文章