更新時間:2022-09-15 09:56:57 來源:動力節點 瀏覽2066次
解決mq消息丟失問題的方案有哪些?動力節點小編來告訴大家。
解決辦法:
(1)事務機制:(同步方式,不推薦)
對于RabbitMQ消息隊列來說,生產者發送數據之前開啟RabbitMQ的事務機制 channel.txselect,如果消息沒有進隊列,則生產者受到異常報錯,并進行回滾channel.txRollback,然后重試發送消息。如果收到了消息,則可以提交事務channel.txCommit。這是同步操作,會影響性能。
(2)異步機制:
confirm模式來解決同步機制的性能問題。每次生產者發送的消息都會分配一個唯一的id,如果寫入到了RabbitMQ隊列中,則RabbitMQ會回傳一個ack消息,說明這個消息接收成功。如果RabbitMQ沒能處理這個消息,則回調nack接口。說明需要重試發送消息。
也可以自定義超時時間 + 消息 id 來實現超時等待后重試機制。但可能出現的問題是調用ack接口時失敗了,所以會出現消息被發送兩次的問題,這個時候就需要保證消費者消費消息的冪等性。
事務模式和confirm模式的區別:
事務機制是同步的,提交事務后悔被阻塞直到提交事務完成后。
confirm 模式異步接收通知,但可能接收不到通知。需要考慮接收不到通知的場景。
解決辦法:
(1)創建Queue時,將其設置為持久化
(2)發送消息的時候將消息的deliveryMode設置為2(將消息持久化 1:非持久化,2:持久化)
(3)開啟生產者 confirm`模式,可以重試發送消息。
解決辦法:
關閉RabbitMQ的自動ack,每次生產者將消息寫入消息隊列后,就自動回傳一個ack給生產者。
消費者處理完消息再主動ack,告訴消息隊列我處理完了。
(1)開啟生產者消息手動確認機制
(2)開啟消息持久化,隊列持久化,交換機持久化(默認開啟)
(3)開啟消費者消息手動確認機制
以上就是關于“解決mq消息丟失問題的方案”介紹,大家如果想了解更多相關知識,可以關注一下動力節點的RabbitMQ教程,里面的課程內容由淺到深,很適合沒有基礎的小伙伴學習,希望對大家能夠有所幫助哦。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習