RabbitMQ保證消息的順序性


當我們的系統中引入了MQ之后,不得不考慮的一個問題是如何保證消息的順序性,這是一個至關重要的事情,如果順序錯亂了,就會導致數據的不一致。

       比如:業務場景是這樣的:我們需要根據mysql的binlog日志同步一個數據庫的數據到另一個庫中,加如在binlog中對同一條數據做了insert,update,delete操作,我們往MQ順序寫入了insert,update,delete操作的三條消息,那么根據分析,最終同步到另一個庫中,這條數據是被刪除了的。但是,如果這三條消息不是按照insert,update,delete順序被消費,而是按照delete,insert,update的順序被消費,那么最終這條數據是會保存到新庫中的。這就導致了數據錯亂了。下面分別講解下RabbitMQ和Kafka是如何保證消息的順序性。

1、RabbitMQ如何保證消息順序性
1.1 RabbitMQ的消息不被順序消費的情況


注意:queue(隊列)中的消息只能被一個消費者所消費,然后消費者在消費消息的過程中是無序的。如上圖所示,如果按照BAC的消費順序,那么最終數據庫中是被保存這條數據的。這和我們預期的結果不符,如果這樣的情況很多,那么就造成了數據庫中的數據完成不對,同步工作也是白費了。

1.2 RabbitMQ保證消息順序性的措施


如圖所示,RabbitMQ保證消息的順序性,就是拆分多個 queue,每個 queue 對應一個 consumer(消費者),就是多一些 queue 而已,確實是麻煩點;或者就一個 queue 但是對應一個 consumer,然后這個 consumer 內部用內存隊列做排隊,然后分發給底層不同的 worker 來處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM