更新時(shí)間:2022-09-15 09:56:57 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2407次
解決mq消息丟失問(wèn)題的方案有哪些?動(dòng)力節(jié)點(diǎn)小編來(lái)告訴大家。

解決辦法:
(1)事務(wù)機(jī)制:(同步方式,不推薦)
對(duì)于RabbitMQ消息隊(duì)列來(lái)說(shuō),生產(chǎn)者發(fā)送數(shù)據(jù)之前開(kāi)啟RabbitMQ的事務(wù)機(jī)制 channel.txselect,如果消息沒(méi)有進(jìn)隊(duì)列,則生產(chǎn)者受到異常報(bào)錯(cuò),并進(jìn)行回滾channel.txRollback,然后重試發(fā)送消息。如果收到了消息,則可以提交事務(wù)channel.txCommit。這是同步操作,會(huì)影響性能。
(2)異步機(jī)制:
confirm模式來(lái)解決同步機(jī)制的性能問(wèn)題。每次生產(chǎn)者發(fā)送的消息都會(huì)分配一個(gè)唯一的id,如果寫(xiě)入到了RabbitMQ隊(duì)列中,則RabbitMQ會(huì)回傳一個(gè)ack消息,說(shuō)明這個(gè)消息接收成功。如果RabbitMQ沒(méi)能處理這個(gè)消息,則回調(diào)nack接口。說(shuō)明需要重試發(fā)送消息。
也可以自定義超時(shí)時(shí)間 + 消息 id 來(lái)實(shí)現(xiàn)超時(shí)等待后重試機(jī)制。但可能出現(xiàn)的問(wèn)題是調(diào)用ack接口時(shí)失敗了,所以會(huì)出現(xiàn)消息被發(fā)送兩次的問(wèn)題,這個(gè)時(shí)候就需要保證消費(fèi)者消費(fèi)消息的冪等性。
事務(wù)模式和confirm模式的區(qū)別:
事務(wù)機(jī)制是同步的,提交事務(wù)后悔被阻塞直到提交事務(wù)完成后。
confirm 模式異步接收通知,但可能接收不到通知。需要考慮接收不到通知的場(chǎng)景。

解決辦法:
(1)創(chuàng)建Queue時(shí),將其設(shè)置為持久化
(2)發(fā)送消息的時(shí)候?qū)⑾⒌膁eliveryMode設(shè)置為2(將消息持久化 1:非持久化,2:持久化)
(3)開(kāi)啟生產(chǎn)者 confirm`模式,可以重試發(fā)送消息。

解決辦法:
關(guān)閉RabbitMQ的自動(dòng)ack,每次生產(chǎn)者將消息寫(xiě)入消息隊(duì)列后,就自動(dòng)回傳一個(gè)ack給生產(chǎn)者。
消費(fèi)者處理完消息再主動(dòng)ack,告訴消息隊(duì)列我處理完了。
(1)開(kāi)啟生產(chǎn)者消息手動(dòng)確認(rèn)機(jī)制
(2)開(kāi)啟消息持久化,隊(duì)列持久化,交換機(jī)持久化(默認(rèn)開(kāi)啟)
(3)開(kāi)啟消費(fèi)者消息手動(dòng)確認(rèn)機(jī)制
以上就是關(guān)于“解決mq消息丟失問(wèn)題的方案”介紹,大家如果想了解更多相關(guān)知識(shí),可以關(guān)注一下動(dòng)力節(jié)點(diǎn)的RabbitMQ教程,里面的課程內(nèi)容由淺到深,很適合沒(méi)有基礎(chǔ)的小伙伴學(xué)習(xí),希望對(duì)大家能夠有所幫助哦。
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)