1.為什么要保證順序
消息隊列中的若干消息如果是對同一個數據進行操作,這些操作具有前后的關系,必須要按前后的順序執行,否則就會造成數據異常。舉例:
比如通過mysql binlog進行兩個數據庫的數據同步,由於對數據庫的數據操作是具有順序性的,如果操作順序搞反,就會造成不可估量的錯誤。比如數據庫對一條數據依次進行了 插入->更新->刪除操作,這個順序必須是這樣,如果在同步過程中,消息的順序變成了 刪除->插入->更新,那么原本應該被刪除的數據,就沒有被刪除,造成數據的不一致問題。
2.出現順序錯亂的場景
(1)rabbitmq
①一個queue,有多個consumer去消費,這樣就會造成順序的錯誤,consumer從MQ里面讀取數據是有序的,但是每個consumer的執行時間是不固定的,無法保證先讀到消息的consumer一定先完成操作,這樣就會出現消息並沒有按照順序執行,造成數據順序錯誤。

②一個queue對應一個consumer,但是consumer里面進行了多線程消費,這樣也會造成消息消費順序錯誤。

(2)kafka
①kafka一個topic,一個partition,一個consumer,但是consumer內部進行多線程消費,這樣數據也會出現順序錯亂問題。

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

3.保證消息的消費順序
(1)rabbitmq
①拆分多個queue,每個queue一個consumer,就是多一些queue而已,確實是麻煩點;這樣也會造成吞吐量下降,可以在消費者內部采用多線程的方式取消費。

②或者就一個queue但是對應一個consumer,然后這個consumer內部用內存隊列做排隊,然后分發給底層不同的worker來處理

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

②寫N個內存queue,然后N個線程分別消費一個內存queue即可

作者:一條路上的咸魚
鏈接:https://www.jianshu.com/p/02fdcb9e8784
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。