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

石杉的架構筆記發表於2018-12-25

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

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

上一篇講訊息中介軟體的文章《扎心!線上服務當機時,如何保證資料100%不丟失?》,初步給大家介紹了一個在生產環境中可能遇到的問題,就是你的消費者服務可能會當機,一旦當機,你就需要考慮是否會導致沒處理完的訊息丟失。這篇文章,再給不太熟悉MQ技術的同學,介紹另外一個生產環境中可能會遇到的問題。


前為止,你的RabbitMQ部署線上上伺服器了,對吧?然後訂單服務和倉儲服務都可以基於RabbitMQ來收發訊息,同時倉儲服務當機,不會導致訊息丟失。

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

好,我們來看下目前為止的架構圖。

那如果此時出現一個問題,就是說訂單服務投遞了訂單訊息到RabbitMQ裡去,RabbitMQ暫時放在了自己的記憶體中,還沒來得及投遞給下游的倉儲服務呢,此時RabbitMQ突然當機了,會怎麼樣?

答案其實很簡單,預設情況下,按照我們目前的程式碼和配置,這個資料就會丟失了。

所以在這裡而言,就牽扯到了RabbitMQ的一個較為重要的概念:訊息的持久化,用英文來說就是durable機制。

然後這裡又有一個引申的概念,如果按照我們之前的程式碼和配置,預設情況下,RabbitMQ一旦當機就再次重啟,就會丟失我們之前建立的queue。所以首先得先讓queue是持久化的。

使用下面的程式碼,就可以把我們的“warehouse_schedule_delivery”這個queue,也就是倉儲排程發貨的queue,設定為持久化的。

這樣,即使RabbitMQ當機後重啟,也會恢復之前建立好的這個queue。

channel.queueDeclare(
       "warehouse_schedule_delivery",
        true, 
        false,
        false,
        null);
複製程式碼

大家看到上面那行定義和建立queue的程式碼麼?核心在於第二個引數,第二個引數是true。

他的意思就是說,這個建立的queue是durable的,也就是支援持久化的。

RabbitMQ會把這queue的相關資訊持久化的儲存到磁碟上去,這樣RabbitMQ重啟後,就可以恢復持久化的queue。

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

OK,現在你的queue的資訊可以持久化了,RabbitMQ當機重啟後會自動恢復queue。但是,你的queue裡的message資料呢?

queue裡都是訂單服務傳送過去的訂單訊息資料,如果RabbitMQ還沒來得及投遞queue裡的訂單訊息到倉儲服務,結果RabbitMQ就當機了。

那此時RabbitMQ重啟之後,他可以恢復queue的資訊,但是queue的message資料是沒法恢復了。

所以此時還有一個重要的點,就是在你的訂單服務傳送訊息到RabbitMQ的時候,需要定義這條訊息也是durable,即持久化的。

channel.basicPublish(
 "", 
 "warehouse_schedule_delivery",
 MessageProperties.PERSISTENT_TEXT_PLAIN,
 message.getBytes());

複製程式碼

通過上面的方式來傳送訊息,就可以讓傳送出去的訊息是持久化的。

一旦標記了訊息是持久化之後,就會讓RabbitMQ把訊息持久化寫入到磁碟上去,此時如果RabbitMQ還沒投遞資料到倉儲服務,結果就突然當機了。那麼再次重啟的時候,就會把磁碟上持久化的訊息給載入出來。

整個過程,如下圖所示:

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

但是這裡要注意一點,RabbitMQ的訊息持久化,是不承諾100%的訊息不丟失的。

因為有可能RabbitMQ接收到了訊息,但是還沒來得及持久化到磁碟,他自己就當機了,這個時候訊息還是會丟失的。

如果要完全100%保證寫入RabbitMQ的資料必須落地磁碟,不會丟失,需要依靠其他的機制。

下次有機會再繼續給不太熟悉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倍請求壓力來襲,你的系統會被擊垮嗎?


作者:石杉的架構筆記
連結:https://juejin.im/post/5c1c8f5a6fb9a049fe351f36
來源:掘金
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。


相關文章