互聯網面試必殺:如何保證消息中間件全鏈路數據100%不丟失(1)【石杉的架構筆記】

收藏待读

互聯網面試必殺:如何保證消息中間件全鏈路數據100%不丟失(1)【石杉的架構筆記】

這篇文章,我們來聊聊在線上生產環境使用消息中間件技術的時候,從前到後的全鏈路到底如何保證數據不能丟失。

這個問題,在互聯網公司面試的時候高頻出現,而且也是非常現實的生產環境問題。

如果你的簡歷中寫了自己熟悉MQ技術(RabbitMQ、RocketMQ、Kafka),而且在項目里有使用的經驗,那麼非常實際的一個生產環境問題就是:投遞消息到MQ,然後從MQ消費消息來處理的這個過程,數據到底會不會丟失。

面試官此時會問:如果數據會丟失的話,你們項目生產部署的時候,是通過什麼手段保證基於MQ傳輸的數據100%不會丟失的?麻煩結合你們線上使用的消息中間件來具體說說你們的技術方案。

這個其實就是非常區分面試候選人技術水平的一個問題。

實際上相當大比例的普通工程師,哪怕是在一些中小型互聯網公司里工作過的,也就是基於公司部署的MQ集群簡單的使用一下罷了,可能代碼層面就是基本的發送消息和消費消息,基本沒考慮太多的技術方案。

但是實際上,對於MQ、緩存、分庫分表、NoSQL等各式各類的技術以及中間件在使用的時候,都會有對應技術相關的一堆生產環境問題。

那麼針對這些問題,就必須要有相對應的一整套技術方案來保證系統的健壯性、穩定性以及高可用性。

所以其實中大型互聯網公司的面試官在面試候選人的時候,如果考察對MQ相關技術的經驗和掌握程度,十有八九都會拋出這個使用MQ時一定會涉及的數據丟失問題。因為這個問題,能夠非常好的區分候選人的技術水平。

所以這篇文章,我們就來具體聊聊基於RabbitMQ這種消息中間件的背景下,從投遞消息到MQ,到從MQ消費消息出來,這個過程中有哪些數據丟失的風險和可能。

然後我們再一起來看看,應該如何結合MQ自身提供的一些技術特性來保證數據不丟失?

2、前情回顧

首先給大夥一點提醒,有些新同學可能還對MQ相關技術不太了解,建議看一下之前的MQ系列文章,看看MQ的基本使用和原理:

「Java進階面試系列之一」你們系統架構中為何要引入消息中間件?

「Java進階面試系列之二」系統架構引入消息中間件有什麼缺點

「Java進階面試系列之三」消息中間件在你們項目里是如何落地的?

另外,其實之前我們有過2篇文章是討論消息中間件的數據不丟失問題的。

我們分別從消費者突然宕機可能導致數據丟失,以及集群突然崩潰可能導致的數據丟失兩個角度討論了一下數據如何不丟失。

只不過僅僅那兩個方案還無法保證全鏈路數據不丟失,但是大家如果沒看過的建議也先回過頭看看:

扎心!線上服務宕機時,如何保證數據100%不丟失?

消息中間件集群崩潰,如何保證百萬生產數據不丟失?

總之,希望對MQ不太熟悉的同學,先把前面那些系列文章熟悉一下,然後再來一起系統性的研究一下MQ數據如何做到100%不丟失。

3、目前已有的技術方案

經過之前幾篇文章的討論,目前我們已經初步知道,第一個會導致數據丟失的地方,就是消費者獲取到消息之後,沒有來得及處理完畢,自己直接宕機了。

此時RabbitMQ的自動ack機制會通知MQ集群這條消息已經處理好了,MQ集群就會刪除這條消息。

那麼這條消息不就丟失了么?不會有任何一個消費者處理到這條消息了。

所以之前我們詳細討論過,通過在消費者服務中調整為手動ack機制,來確保消息一定是已經成功處理完了,才會發送ack通知給MQ集群。

否則沒發送ack之前消費者服務宕機,此時MQ集群會自動感知到,然後重發消息給其他的消費者服務實例。

扎心!線上服務宕機時,如何保證數據100%不丟失?

這篇文章,詳細討論了這個問題,手動ack機制之下的架構圖如下所示:

互聯網面試必殺:如何保證消息中間件全鏈路數據100%不丟失(1)【石杉的架構筆記】

當時除了這個數據丟失問題之外,還有另外一個問題,就是MQ集群自身如果突然宕機,是不是會導致數據丟失?

默認情況下是肯定會的,因為queue和message都沒採用持久化的方式來投遞,所以MQ集群重啟會導致部分數據丟失。

消息中間件集群崩潰,如何保證百萬生產數據不丟失?

這篇文章,我們分析了如何採用持久化的方式來創建queue,同時採用持久化的方式來投遞消息到MQ集群,這樣MQ集群會將消息持久化到磁盤上去。

此時如果消息還沒來得及投遞給消費者服務,然後MQ集群突然宕機了,數據是不會丟失的,因為MQ集群重啟之後會自動從磁盤文件里加載出來沒投遞出去的消息,然後繼續投遞給消費者服務。

同樣,該方案沉澱下來的系統架構圖,如下所示:

互聯網面試必殺:如何保證消息中間件全鏈路數據100%不丟失(1)【石杉的架構筆記】

4、數據100%不丟失了嗎?

大家想一想,到目前為止,咱們的架構一定可以保證數據不丟失了嗎?

其實,現在的架構,還是有一個數據可能會丟失的問題。

那就是上面作為生產者的訂單服務把消息投遞到MQ集群之後,暫時還駐留在MQ的內存里,還沒來得及持久化到磁盤上,同時也還沒來得及投遞到作為消費者的倉儲服務。

此時要是MQ集群自身突然宕機,咋辦呢?

尷尬了吧,駐留在內存里的數據是一定會丟失的,我們來看看下面的圖示。

互聯網面試必殺:如何保證消息中間件全鏈路數據100%不丟失(1)【石杉的架構筆記】

5、按需制定技術方案

現在,我們需要考慮的技術方案是:訂單服務如何保證消息一定已經持久化到磁盤?

實際上,作為生產者的訂單服務把消息投遞到MQ集群的過程是很容易丟數據的。

比如說網絡出了點什麼故障,數據壓根兒沒傳輸過去,或者就是上面說的消息剛剛被MQ接收但是還駐留在內存里,沒落地到磁盤上,此時MQ集群宕機就會丟數據。

所以首先,我們得考慮一下作為生產者的訂單服務要如何利用RabbitMQ提供的相關功能來實現一個技術方案。

這個技術方案需要保證:只要訂單服務發送出去的消息確認成功了,此時MQ集群就一定已經將消息持久化到磁盤了。

我們必須實現這樣的一個效果,才能保證投遞到MQ集群的數據是不會丟失的。

6、需要研究的技術細節

這裡我們需要研究的技術細節是:倉儲服務手動ack保證數據不丟失的實現原理。

之前,筆者就收到很多同學提問:

倉儲服務那塊到底是如何基於手動ack就可以實現數據不丟失的? RabbitMQ底層實現的細節和原理到底是什麼? 為什麼倉儲服務沒發送ack就宕機了,RabbitMQ可以自動感知到他宕機了,然後自動重發消息給其他的倉儲服務實例呢?

這些東西背後的實現原理和底層細節,到底是什麼?

大伙兒稍安勿躁,接下來,咱們會通過一系列文章,仔細探究一下這背後的原理。

End

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

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

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

互聯網面試必殺:如何保證消息中間件全鏈路數據100%不丟失(1)【石杉的架構筆記】

石杉的架構筆記(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、 億級流量系統架構之如何保證百億流量下的數據一致性(下)?

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

原文 : 稀土掘金

相關閱讀

免责声明:本文内容来源于稀土掘金,已注明原文出处和链接,文章观点不代表立场,如若侵犯到您的权益,或涉不实谣言,敬请向我们提出检举。