1 面試題
如何保證消息的順序性?
2 考點分析
MQ必問話題
- 考察你是否了解順序性
- 考察你是否有辦法保證消息的順序性,因為這是生產系統(tǒng)中常見的一個問題.
3 詳解
3.0 案例
一個MySQL binlog同步系統(tǒng),日同步數(shù)據(jù)達到上億.
- 在MySQL里
增刪改
一條數(shù)據(jù) - 即對應出增刪改3條binlog
- 接著這三條binlog發(fā)送到MQ里面
- 消費出來依次執(zhí)行
應該得保證消息按照順序執(zhí)行的吧!
不然本來是:增加->修改->刪除
你楞是換了順序給執(zhí)行成:刪除->修改->增加
全錯!!!
該數(shù)據(jù)同步過來款青,最后本該被刪除,結果你搞錯順序,最后它卻被保留下來了辩涝,數(shù)據(jù)同步出錯!
3.1 順序錯亂的場景
3.1.1 rabbitmq
一個queue,多個consumer新蟆,這不明顯亂了
image
3.1.2 kafka
一個topic觅赊,一個partition,一個consumer琼稻,內部多線程吮螺,這也明顯亂了
image
3.2 保證消息的順序性
3.2.1 rabbitmq
拆分多個queue,每個queue一個consumer
就是多一些queue而已帕翻,確實麻煩點
或者就一個queue但是對應一個consumer鸠补,然后這個consumer內部用內存隊列做排隊,然后分發(fā)給底層不同的worker來處理
image
3.2.2 kafka
一個topic嘀掸,一個partition紫岩,一個consumer,內部單線程消費睬塌,寫N個內存queue泉蝌,然后N個線程分別消費一個內存queue即可
image
參考
《Java工程師面試突擊第1季-中華石杉老師》