歡迎關注個人公眾號:石杉的架構筆記(ID:shishan100)
週一至週五早8點半!精品技術文章準時送上!
“上一篇講訊息中介軟體的文章《扎心!線上服務當機時,如何保證資料100%不丟失?》,初步給大家介紹了一個在生產環境中可能遇到的問題,就是你的消費者服務可能會當機,一旦當機,你就需要考慮是否會導致沒處理完的訊息丟失。這篇文章,再給不太熟悉MQ技術的同學,介紹另外一個生產環境中可能會遇到的問題。
目前為止,你的RabbitMQ部署線上上伺服器了,對吧?然後訂單服務和倉儲服務都可以基於RabbitMQ來收發訊息,同時倉儲服務當機,不會導致訊息丟失。
好,我們來看下目前為止的架構圖。
那如果此時出現一個問題,就是說訂單服務投遞了訂單訊息到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。
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還沒投遞資料到倉儲服務,結果就突然當機了。那麼再次重啟的時候,就會把磁碟上持久化的訊息給載入出來。
整個過程,如下圖所示:
但是這裡要注意一點,RabbitMQ的訊息持久化,是不承諾100%的訊息不丟失的。
因為有可能RabbitMQ接收到了訊息,但是還沒來得及持久化到磁碟,他自己就當機了,這個時候訊息還是會丟失的。
如果要完全100%保證寫入RabbitMQ的資料必須落地磁碟,不會丟失,需要依靠其他的機制。
下次有機會再繼續給不太熟悉MQ技術的同學,來講解這裡的東西。
END
如有收穫,請幫忙轉發,您的鼓勵是作者最大的動力,謝謝!
一大波微服務、分散式、高併發、高可用的原創系列文章正在路上
歡迎掃描下方二維碼,持續關注:
石杉的架構筆記(id:shishan100)
十餘年BAT架構經驗傾囊相授
推薦閱讀:2、【雙11狂歡的背後】微服務註冊中心如何承載大型系統的千萬級訪問?
3、【效能優化之道】每秒上萬併發下的Spring Cloud引數優化實戰
6、大規模叢集下Hadoop NameNode如何承載每秒上千次的高併發訪問
7、【效能優化的祕密】Hadoop如何將TB級大檔案的上傳效能優化上百倍
8、拜託,面試請不要再問我TCC分散式事務的實現原理坑爹呀!
9、【坑爹呀!】最終一致性分散式事務如何保障實際生產中99.99%高可用?
11、【眼前一亮!】看Hadoop底層演算法如何優雅的將大規模叢集效能提升10倍以上?
16、億級流量系統架構之如何設計全鏈路99.99%高可用架構
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%不丟失?
作者:石杉的架構筆記
連結:https://juejin.im/post/5c1c8f5a6fb9a049fe351f36
來源:掘金
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。