關於MQ的幾件小事(五)如何保證消息按順序執行

1.爲何要保證順序

消息隊列中的若干消息若是是對同一個數據進行操做,這些操做具備先後的關係,必需要按先後的順序執行,不然就會形成數據異常。舉例: 好比經過mysql binlog進行兩個數據庫的數據同步,因爲對數據庫的數據操做是具備順序性的,若是操做順序搞反,就會形成不可估量的錯誤。好比數據庫對一條數據依次進行了 插入->更新->刪除操做,這個順序必須是這樣,若是在同步過程當中,消息的順序變成了 刪除->插入->更新,那麼本來應該被刪除的數據,就沒有被刪除,形成數據的不一致問題。html

2.出現順序錯亂的場景

(1)rabbitmq ①一個queue,有多個consumer去消費,這樣就會形成順序的錯誤,consumer從MQ裏面讀取數據是有序的,可是每一個consumer的執行時間是不固定的,沒法保證先讀到消息的consumer必定先完成操做,這樣就會出現消息並無按照順序執行,形成數據順序錯誤。 rabbitmq消息順序錯亂第一種狀況示意圖.pngmysql

②一個queue對應一個consumer,可是consumer裏面進行了多線程消費,這樣也會形成消息消費順序錯誤。 abbitmq消息順序錯亂第二種狀況示意圖.pngsql

(2)kafka ①kafka一個topic,一個partition,一個consumer,可是consumer內部進行多線程消費,這樣數據也會出現順序錯亂問題。 kafka消息順序錯亂第一種狀況示意圖.png數據庫

②具備順序的數據寫入到了不一樣的partition裏面,不一樣的消費者去消費,可是每一個consumer的執行時間是不固定的,沒法保證先讀到消息的consumer必定先完成操做,這樣就會出現消息並無按照順序執行,形成數據順序錯誤。 kafka消息順序錯亂第二種狀況示意圖..png多線程

3.保證消息的消費順序

(1)rabbitmq ①拆分多個queue,每一個queue一個consumer,就是多一些queue而已,確實是麻煩點;這樣也會形成吞吐量降低,能夠在消費者內部採用多線程的方式取消費。 一個queue對應一個consumerurl

②或者就一個queue可是對應一個consumer,而後這個consumer內部用內存隊列作排隊,而後分發給底層不一樣的worker來處理 一個queue對應一個consumer,採用多線程.pngspa

(2)kafka ①確保同一個消息發送到同一個partition,一個topic,一個partition,一個consumer,內部單線程消費。 單線程保證順序.png.net

②寫N個內存queue,而後N個線程分別消費一個內存queue便可 多線程保證順序.png線程

上一篇《如何防止數據隊列數據丟失htm

下一篇《消息積壓在消息隊列裏怎麼辦

相關文章
相關標籤/搜索