RabbitMQ如何保證訊息的可靠性投遞

2021-09-22 20:04:24 字數 1238 閱讀 6782

目前來說,現在有兩種方案實施:

1.資料庫持久化方案

2.訊息延遲投遞方案

資料庫持久化方案

流程:

1.將業務訂單資料和生成的message進行持久化操作(一般情況下插入資料庫,這裡如果分庫的話可能涉及到分布式事務)

2.將message傳送到broker伺服器中

3.通過rabbitmq的confirm機制,在producer端,監聽伺服器是否ack。

4.如果ack了,就將message這條資料狀態更新為已傳送。如果失敗,修改為失敗狀態。

5.分布式定時任務查詢資料庫3分鐘(這個具體時間應該根據的時效性來定)之前的傳送失敗的訊息

6.重新傳送訊息,記錄傳送次數

7.如果傳送次數過多仍然失敗,那麼就需要人工排查之類的操作。

優點:
能夠保證訊息百分百不丟失
缺點:
1.第一步中涉及到分布式事務問題,分布式事務一點會降低時效性(據說網際網路大廠一般不會使用分布式事務)。

2.

訊息延遲投遞方案(據說網際網路大廠使用該方案)

流程:

流程圖中,顏色不同的代表不同的message

1.將業務訂單持久化

2.傳送一條message到broker(稱之為主message),再傳送相同的一條到不同的佇列或者交換機(這條稱為確認message)中。

3.主message由實際業務處理端消費後,生成一條響應message。之前的確認message由message service應用處理入庫。

4~6.實際業務處理端傳送的確認message由message service接收後,將原message狀態修改。

7.如果該條message沒有被確認,則通過rpc呼叫重新由producer進行全過程。

優點:
1.相對於資料庫持久化方案來說響應速度有所提公升
缺點:
1.系統複雜性有點高

2.萬一兩條訊息都失敗了,訊息存在丟失情況,仍需confirm機制做補償

RabbitMQ 如何保證訊息不丟失?

rabbitmq 如何保證訊息不丟失?rabbitmq一般情況很少丟失,但是不能排除意外,為了保證我們自己系統高可用,我們必須作出更好完善措施,保證系統的穩定性。下面來介紹下,如何保證訊息的絕對不丟失的問題,下面分享的絕對乾貨,都是在知名網際網路產品的產線中使用。1.訊息持久化 2.ack確認機制 ...

Rabbitmq如何保證訊息順序執行

訊息佇列中的若干訊息如果是對同乙個資料進行操作,這些操作具有前後的關係,必須要按前後的順序執行,否則就會造成資料異常。舉例 比如通過mysql binlog進行兩個資料庫的資料同步,由於對資料庫的資料操作是具有順序性的,如果操作順序搞反,就會造成不可估量的錯誤。比如資料庫對一條資料依次進行了 插入 ...

RabbitMQ如何保證訊息不丟失

rabbitmq 大致有三種場景會發生訊息丟失 1 consumer沒有接收到訊息,消費之前 2 consumer接收到訊息,訊息暫存記憶體,還未消費 3 consumer消費時 第一種丟失場景就像我剛剛到達便利店,還沒選好買什麼商品,這個時候便利店突然斷電,無法消費 這種場景下使用message ...