關(guān)于MQ的幾件小事(五)如何保證消息按順序執(zhí)行

1.為什么要保證順序

消息隊列中的若干消息如果是對同一個數(shù)據(jù)進行操作,這些操作具有前后的關(guān)系,必須要按前后的順序執(zhí)行,否則就會造成數(shù)據(jù)異常。舉例:
比如通過mysql binlog進行兩個數(shù)據(jù)庫的數(shù)據(jù)同步,由于對數(shù)據(jù)庫的數(shù)據(jù)操作是具有順序性的,如果操作順序搞反,就會造成不可估量的錯誤。比如數(shù)據(jù)庫對一條數(shù)據(jù)依次進行了 插入->更新->刪除操作,這個順序必須是這樣,如果在同步過程中,消息的順序變成了 刪除->插入->更新,那么原本應(yīng)該被刪除的數(shù)據(jù),就沒有被刪除,造成數(shù)據(jù)的不一致問題。

2.出現(xiàn)順序錯亂的場景

(1)rabbitmq
①一個queue,有多個consumer去消費,這樣就會造成順序的錯誤,consumer從MQ里面讀取數(shù)據(jù)是有序的,但是每個consumer的執(zhí)行時間是不固定的,無法保證先讀到消息的consumer一定先完成操作,這樣就會出現(xiàn)消息并沒有按照順序執(zhí)行,造成數(shù)據(jù)順序錯誤。


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

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


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

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


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

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


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

3.保證消息的消費順序

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


一個queue對應(yīng)一個consumer

②或者就一個queue但是對應(yīng)一個consumer,然后這個consumer內(nèi)部用內(nèi)存隊列做排隊,然后分發(fā)給底層不同的worker來處理


一個queue對應(yīng)一個consumer,采用多線程.png

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


單線程保證順序.png

②寫N個內(nèi)存queue,然后N個線程分別消費一個內(nèi)存queue即可


多線程保證順序.png

上一篇《如何防止數(shù)據(jù)隊列數(shù)據(jù)丟失
下一篇《消息積壓在消息隊列里怎么辦

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容