更新時間:2022-09-15 09:56:57 來源:動力節(jié)點 瀏覽2191次
解決mq消息丟失問題的方案有哪些?動力節(jié)點小編來告訴大家。
解決辦法:
(1)事務(wù)機制:(同步方式,不推薦)
對于RabbitMQ消息隊列來說,生產(chǎn)者發(fā)送數(shù)據(jù)之前開啟RabbitMQ的事務(wù)機制 channel.txselect,如果消息沒有進隊列,則生產(chǎn)者受到異常報錯,并進行回滾channel.txRollback,然后重試發(fā)送消息。如果收到了消息,則可以提交事務(wù)channel.txCommit。這是同步操作,會影響性能。
(2)異步機制:
confirm模式來解決同步機制的性能問題。每次生產(chǎn)者發(fā)送的消息都會分配一個唯一的id,如果寫入到了RabbitMQ隊列中,則RabbitMQ會回傳一個ack消息,說明這個消息接收成功。如果RabbitMQ沒能處理這個消息,則回調(diào)nack接口。說明需要重試發(fā)送消息。
也可以自定義超時時間 + 消息 id 來實現(xiàn)超時等待后重試機制。但可能出現(xiàn)的問題是調(diào)用ack接口時失敗了,所以會出現(xiàn)消息被發(fā)送兩次的問題,這個時候就需要保證消費者消費消息的冪等性。
事務(wù)模式和confirm模式的區(qū)別:
事務(wù)機制是同步的,提交事務(wù)后悔被阻塞直到提交事務(wù)完成后。
confirm 模式異步接收通知,但可能接收不到通知。需要考慮接收不到通知的場景。
解決辦法:
(1)創(chuàng)建Queue時,將其設(shè)置為持久化
(2)發(fā)送消息的時候?qū)⑾⒌膁eliveryMode設(shè)置為2(將消息持久化 1:非持久化,2:持久化)
(3)開啟生產(chǎn)者 confirm`模式,可以重試發(fā)送消息。
解決辦法:
關(guān)閉RabbitMQ的自動ack,每次生產(chǎn)者將消息寫入消息隊列后,就自動回傳一個ack給生產(chǎn)者。
消費者處理完消息再主動ack,告訴消息隊列我處理完了。
(1)開啟生產(chǎn)者消息手動確認機制
(2)開啟消息持久化,隊列持久化,交換機持久化(默認開啟)
(3)開啟消費者消息手動確認機制
以上就是關(guān)于“解決mq消息丟失問題的方案”介紹,大家如果想了解更多相關(guān)知識,可以關(guān)注一下動力節(jié)點的RabbitMQ教程,里面的課程內(nèi)容由淺到深,很適合沒有基礎(chǔ)的小伙伴學習,希望對大家能夠有所幫助哦。