rabbit mq消息隊列導(dǎo)致的死循環(huán)如何預(yù)防

昨天本地啟動一個服務(wù)的時候,發(fā)現(xiàn)一個消費rabbit mq的地方拋出異常,而且不斷的重復(fù)執(zhí)行,debug發(fā)現(xiàn)每次都是消費的都是同樣的數(shù)據(jù),查資料發(fā)現(xiàn)是mq的自動確認(rèn)機(jī)制導(dǎo)致的。
可參考這個
http://www.itdecent.cn/p/f10161bf19c7
推薦使用自動重試機(jī)制。

自動重試機(jī)制會在本地重試一定次數(shù),如果還是失敗,則把消息放到死信隊列,這樣消息就不會無限重推了,但是此時需要專門寫代碼去處理死信隊列的消息,不然無法檢測消息失敗的情況。

問題?
我在代碼并沒有調(diào)用ack,客戶端是如何確認(rèn)的消息?
原來是spring rabbit提供的自動確認(rèn)的設(shè)置, acknowledge-mode=auto
的話,如果代碼不拋異常,會幫我們提交ack到mq服務(wù)端,這也是為什么代碼有異常之后,消息就無法確認(rèn)了。

可參考
http://www.itdecent.cn/p/8127ca9b8f35
最后,個人推薦的MQ設(shè)置方法:
1 生產(chǎn)者設(shè)置為人工ack,避免丟消息。
2 消費端設(shè)置自動重試1次,失敗后丟入死信隊列。
3 監(jiān)控死信隊列做業(yè)務(wù)報警。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容