背景
講真的,只要你簡歷上寫的有rabbitmq,面試一定會問,如何保證訊息不丟失,當然在作業中,也很需要,下面是我使用中以及面試中,總結的,
措施
從3個層面去分析
我們使用訊息佇列,一定會涉及三個模型,
那么就要從這三個維度就分析,

1、生產訊息
原因:
因網路抖動,服務器宕機等,
解決方案
確保我們的正在發送的訊息不被丟失,rabbitmq 給我們提供兩種機制,
同步和異步倆種方案
1.1 、同步效率低,運用的事物機制,效率比較低 ,(不推薦)
1.2 、異步,異步使用的是異步監聽,
分為倆部分,基于監聽機制,
一、實作 confimCallback ,確保我們的訊息發送到交換機
二、實作 returnCallBack,確保我們的訊息從交換機發送到佇列,
附圖說明:
注:
我們可以發生例外在回呼之中記錄log,保證我們的訊息,
發送失敗才會觸發rabbitmq回呼機制,

2、佇列訊息
原因:
因rabbitmq 服務器宕機導致的問題
解決方案
為了確保rabbitmq上,已經存在未被消費的訊息不被丟失,
2.1 、我們可以設定 queue 佇列持久化,
2.2 、如果我們使用了交換機,也要記得設定一下我們的 exchange 交換機持久化,
3、消費訊息
原因:
因業務處理例外,導致訊息未被消費掉,自動ack,導致丟失的問題
解決方案:
3.1、修改默認自動確認機制,改為手動確認,
如何修改手動確認,rabbitmq 提供一個 channel ,
在代碼執行完之后呼叫,channel.basicAck() 方法,里面會傳倆個值,
一個是訊息投發的狀態,一個是布爾,確認我們的訊息被消費掉,
3.2、設定重試機制,并設定重試時間間隔,這個主要是為了防止因網路抖動的問題,
3.3、對重試失敗的訊息,放入到死信佇列,并記錄到日志庫里面,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/267038.html
標籤:其他
上一篇:網路好不好,ping一下就知道
