您好,登錄后才能下訂單哦!
這篇“mq消息丟失問題如何解決”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“mq消息丟失問題如何解決”文章吧。
解決辦法:
(1)事務(wù)機(jī)制:(同步方式,不推薦)
對(duì)于RabbitMQ消息隊(duì)列來說,生產(chǎn)者發(fā)送數(shù)據(jù)之前開啟RabbitMQ的事務(wù)機(jī)制 channel.txselect,如果消息沒有進(jìn)隊(duì)列,則生產(chǎn)者受到異常報(bào)錯(cuò),并進(jìn)行回滾channel.txRollback,然后重試發(fā)送消息。如果收到了消息,則可以提交事務(wù)channel.txCommit。這是同步操作,會(huì)影響性能。
(2)異步機(jī)制:
confirm模式來解決同步機(jī)制的性能問題。每次生產(chǎn)者發(fā)送的消息都會(huì)分配一個(gè)唯一的id,如果寫入到了RabbitMQ隊(duì)列中,則RabbitMQ會(huì)回傳一個(gè)ack消息,說明這個(gè)消息接收成功。如果RabbitMQ沒能處理這個(gè)消息,則回調(diào)nack接口。說明需要重試發(fā)送消息。
也可以自定義超時(shí)時(shí)間 + 消息 id 來實(shí)現(xiàn)超時(shí)等待后重試機(jī)制。但可能出現(xiàn)的問題是調(diào)用ack接口時(shí)失敗了,所以會(huì)出現(xiàn)消息被發(fā)送兩次的問題,這個(gè)時(shí)候就需要保證消費(fèi)者消費(fèi)消息的冪等性。
事務(wù)模式和confirm模式的區(qū)別:
事務(wù)機(jī)制是同步的,提交事務(wù)后悔被阻塞直到提交事務(wù)完成后。
confirm 模式異步接收通知,但可能接收不到通知。需要考慮接收不到通知的場景。
解決辦法:
(1)創(chuàng)建Queue時(shí),將其設(shè)置為持久化
(2)發(fā)送消息的時(shí)候?qū)⑾⒌膁eliveryMode設(shè)置為2(將消息持久化 1:非持久化,2:持久化)
(3)開啟生產(chǎn)者 confirm`模式,可以重試發(fā)送消息。
解決辦法:
關(guān)閉RabbitMQ的自動(dòng)ack,每次生產(chǎn)者將消息寫入消息隊(duì)列后,就自動(dòng)回傳一個(gè)ack給生產(chǎn)者。
消費(fèi)者處理完消息再主動(dòng)ack,告訴消息隊(duì)列我處理完了。
(1)開啟生產(chǎn)者消息手動(dòng)確認(rèn)機(jī)制
(2)開啟消息持久化,隊(duì)列持久化,交換機(jī)持久化(默認(rèn)開啟)
(3)開啟消費(fèi)者消息手動(dòng)確認(rèn)機(jī)制
以上就是關(guān)于“mq消息丟失問題如何解決”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。