Rabbitmq如何保證訊息順序執行

2021-10-24 15:54:59 字數 1736 閱讀 3336

訊息佇列中的若干訊息如果是對同乙個資料進行操作,這些操作具有前後的關係,必須要按前後的順序執行,否則就會造成資料異常。舉例:

比如通過mysql binlog進行兩個資料庫的資料同步,由於對資料庫的資料操作是具有順序性的,如果操作順序搞反,就會造成不可估量的錯誤。比如資料庫對一條資料依次進行了 插入->更新->刪除操作,這個順序必須是這樣,如果在同步過程中,訊息的順序變成了 刪除->插入->更新,那麼原本應該被刪除的資料,就沒有被刪除,造成資料的不一致問題。

(1)rabbitmq

①乙個queue,有多個consumer去消費,這樣就會造成順序的錯誤,consumer從mq裡面讀取資料是有序的,但是每個consumer的執行時間是不固定的,無法保證先讀到訊息的consumer一定先完成操作,這樣就會出現訊息並沒有按照順序執行,造成資料順序錯誤。

rabbitmq訊息順序錯亂第一種情況示意圖.png

②乙個queue對應乙個consumer,但是consumer裡面進行了多執行緒消費,這樣也會造成訊息消費順序錯誤。

abbitmq訊息順序錯亂第二種情況示意圖.png

(2)kafka

①kafka乙個topic,乙個partition,乙個consumer,但是consumer內部進行多執行緒消費,這樣資料也會出現順序錯亂問題。

kafka訊息順序錯亂第一種情況示意圖.png

②具有順序的資料寫入到了不同的partition裡面,不同的消費者去消費,但是每個consumer的執行時間是不固定的,無法保證先讀到訊息的consumer一定先完成操作,這樣就會出現訊息並沒有按照順序執行,造成資料順序錯誤。

kafka訊息順序錯亂第二種情況示意圖..png

(1)rabbitmq

①拆分多個queue,每個queue乙個consumer,就是多一些queue而已,確實是麻煩點;這樣也會造成吞吐量下降,可以在消費者內部採用多執行緒的方式取消費。

乙個queue對應乙個consumer

②或者就乙個queue但是對應乙個consumer,然後這個consumer內部用記憶體佇列做排隊,然後分發給底層不同的worker來處理

乙個queue對應乙個consumer,採用多執行緒.png

(2)kafka

①確保同乙個訊息傳送到同乙個partition,乙個topic,乙個partition,乙個consumer,內部單執行緒消費。

單執行緒保證順序.png

②寫n個記憶體queue,然後n個執行緒分別消費乙個記憶體queue即可

多執行緒保證順序.png

RabbitMQ 如何保證訊息不丟失?

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

RabbitMQ如何保證訊息不丟失

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

RabbitMQ 如何保證訊息不丟失?

1.發訊息的時候確定訊息發出去了 訊息確認 2.rabbitmq伺服器也不會丟訊息 儲存到硬碟中 3.收訊息的時候,確保業務完成 手動應答 下面來介紹下,如何保證訊息的絕對不丟失的問題,下面分享的絕對乾貨,都是在知名網際網路產品的產線中使用。1.訊息持久化 2.ack確認機制 3.設定集群映象模式 ...