昨天本地啟動一個服務(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ù)報警。