本文選自:advanced-java
作者:yanglbme
問:如何保證消息的順序性?
面試官心理分析
其實這個也是用 MQ 的時候必問的話題,第一看看你了不了解順序這個事兒?第二看看你有沒有辦法保證消息是有順序的?這是生產系統中常見的問題。
面試題剖析
我舉個例子,我們以前做過一個 mysql binlog 同步的系統,壓力還是非常大的,日同步數據要達到上億,就是說數據從一個 mysql 庫原封不動地同步到另一個 mysql 庫裡面去(mysql -> mysql)。常見的一點在於說比如大數據 team,就需要同步一個 mysql 庫過來,對公司的業務系統的數據做各種複雜的操作。
你在 mysql 里增刪改一條數據,對應出來了增刪改 3 條 binlog 日誌,接著這三條 binlog 發送到 MQ 裡面,再消費出來依次執行,起碼得保證人家是按照順序來的吧?不然本來是:增加、修改、刪除;你楞是換了順序給執行成刪除、修改、增加,不全錯了麼。
本來這個數據同步過來,應該最後這個數據被刪除了;結果你搞錯了這個順序,最後這個數據保留下來了,數據同步就出錯了。
先看看順序會錯亂的倆場景:
解決方案
RabbitMQ
拆分多個 queue,每個 queue 一個 consumer,就是多一些 queue 而已,確實是麻煩點;或者就一個 queue 但是對應一個 consumer,然後這個 consumer 內部用內存隊列做排隊,然後分發給底層不同的 worker 來處理。
Kafka