消息隊列的面試題5
1、面試題
如何保證消息的順序性?
2、面試官心裡分析
其實這個也是用MQ的時候必問的話題,第一看看你了解不了解順序這個事兒?第二看看你有沒有辦法保證消息是有順序的?這個生産系統中常見的問題。
3、面試題剖析
我舉個例子,我們以前做過一個mysql binlog同步的系統,壓力還是非常大的,日同步資料要達到上億。mysql -> mysql,常見的一點在于說大資料team,就需要同步一個mysql庫過來,對公司的業務系統的資料做各種複雜的操作。
你在mysql裡增删改一條資料,對應出來了增删改3條binlog,接着這三條binlog發送到MQ裡面,到消費出來依次執行,起碼得保證人家是按照順序來的吧?不然本來是:增加、修改、删除;你楞是換了順序給執行成删除、修改、增加,不全錯了麼。
本來這個資料同步過來,應該最後這個資料被删除了;結果你搞錯了這個順序,最後這個資料保留下來了,資料同步就出錯了。
先看看順序會錯亂的倆場景
(1)rabbitmq:一個queue,多個consumer,這不明顯亂了

(2)kafka:一個topic,一個partition,一個consumer,内部多線程,這不也明顯亂了
那如何保證消息的順序性呢?簡單簡單
(1)rabbitmq:拆分多個queue,每個queue一個consumer,就是多一些queue而已,确實是麻煩點;或者就一個queue但是對應一個consumer,然後這個consumer内部用記憶體隊列做排隊,然後分發給底層不同的worker來處理
(2)kafka:一個topic,一個partition,一個consumer,内部單線程消費,寫N個記憶體queue,然後N個線程分别消費一個記憶體queue即可