溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

RabbitMQ如何實(shí)現(xiàn)消息的可靠性投遞

發(fā)布時間:2021-12-24 09:31:30 來源:億速云 閱讀:131 作者:小新 欄目:云計算

這篇文章給大家分享的是有關(guān)RabbitMQ如何實(shí)現(xiàn)消息的可靠性投遞的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

一般的消息中間件(MQ)只能保證消息不丟,但是不能保證重復(fù)發(fā)送等問題。

比如在使用Rabbitmq過程中,如何保證消息都能正確的投遞被消費(fèi),這個是要考慮的問題。

那么可靠性投遞所面臨的問題有哪些?

  1. 如果發(fā)送的消息重復(fù)怎么辦。

  2. 如果消息發(fā)送過程中丟了怎么辦。

  3. 如何保證MQ節(jié)點(diǎn)成功收到消息。

  針對這個問題RabbitMQ提供了以下幾個機(jī)制來解決:

  1. 生產(chǎn)者確認(rèn)

  2. 持久化

  3. 手動Ack

  下圖是Rabbitmq一個完整的消息可靠投遞的一個方案。

  RabbitMQ如何實(shí)現(xiàn)消息的可靠性投遞

  我們來分析下。

   Step1:Producer所發(fā)送的數(shù)據(jù)是我們的業(yè)務(wù)數(shù)據(jù),比如訂單信息。Producer在發(fā)送消息之前給我們的訂單信息寫入我們的本地數(shù)據(jù)庫(BIZ DB)中,BIZ DB是我們的業(yè)務(wù)數(shù)據(jù)庫,接著將要發(fā)送到消息存儲到消息記錄數(shù)據(jù)庫中(MSG DB),這個MSG DB就是存儲所有發(fā)送給Rabbitmq的消息記錄用的,寫入消息記錄表中該記錄字段status(狀態(tài))會有幾個值,比如0表示消息發(fā)送中,1表示發(fā)送成功,2表示消息發(fā)送失敗,。

  Step2:應(yīng)用程序要消息發(fā)送給Rabbitmq的Broker,這個發(fā)送的消息屬于confirm模式,發(fā)送后需要Rabbitmq確認(rèn)。

  Step3:Rabbitmq Broker收到消息后會給Producer一個應(yīng)答來確認(rèn)信息,說我已經(jīng)收到消息了。

  Step4:緊跟上一步,Producer一直在監(jiān)聽(Listener)Broker所確認(rèn)的信息,在收到消息之后,根據(jù)收到消息的結(jié)果再去更新MSG DB中的消息發(fā)送狀態(tài),將記錄status字段更新為1。

  Step 5:但是在消息確認(rèn)這個過程中可能由于網(wǎng)絡(luò)閃斷、MQ Broker端異常等原因?qū)е?回送消息失敗或者異常。這個時候就需要發(fā)送方(生產(chǎn)者)對消息進(jìn)行可靠性投遞了,保障消息不丟失,100%的投遞成功?。ㄓ幸环N極限情況是閃斷,Broker返回的成功確認(rèn)消息,但是生產(chǎn)端由于網(wǎng)絡(luò)閃斷沒收到,這個時候重新投遞可能會造成消息重復(fù),需要消費(fèi)端去做冪等處理)所以我們需要有一個定時任務(wù),(比如每5分鐘拉取一下處于中間狀態(tài)的消息,當(dāng)然這個消息可以設(shè)置一個超時時間,比如超過1分鐘 Status = 0 ,也就說明了1分鐘這個時間窗口內(nèi),我們的消息沒有被確認(rèn),那么會被定時任務(wù)拉取出來)。

     Step 6:接下來我們把中間狀態(tài)的消息進(jìn)行重新投遞 retry send,繼續(xù)發(fā)送消息到MQ ,當(dāng)然也可能有多種原因?qū)е掳l(fā)送失敗

    Step 7:我們可以采用設(shè)置最大努力嘗試次數(shù),比如投遞了3次,還是失敗,那么我們可以將最終狀態(tài)設(shè)置為Status = 2 ,最后 交由人工解決處理此類問題(或者把消息轉(zhuǎn)儲到失敗表中)。

感謝各位的閱讀!關(guān)于“RabbitMQ如何實(shí)現(xiàn)消息的可靠性投遞”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI