如何保證消息隊列的順序性?


或者:如何保證從消息隊列里拿到的數據按順序執行?

解決方案的關鍵是在消費者消費之前,將有相關性的數據按順序寫入同一個隊列(queue或者是內存隊列)

 

1、rabbitMQ   中,有個默認是數據1進入一個queue並且只會被一個消費者消費

  場景:(1queue對多consumer)三個消息按順序寫進了1個queue,但是這個queue對應了三個consumer,最終插入DB的順序錯亂了,原本是增刪改,可能最后變成了改增刪

  圖例:

解決方法:拆分多個queue,每個queue對應一個consumer,有相關性的數據按順序寫入一個queue,consumer按順序消費。consumer內部用內存隊列做排隊,然后分發給底層不同worker來處理。

2、kafka  默認是一個partition只能被一個消費者消費

  場景:在最后消費的時候,由於追求吞吐量,采用了多線程處理消費,數據的順序寫庫亂了

解決方案:消費者采用多線程消費消息之前,將相同訂單ID的數據,訂單ID數據hash一下寫入同一個內存隊列(是有順序的),然后交給線程去處理。

注:由於單線程一條消息要處理幾十ms,一秒鍾只能處理幾十條,吞吐量太低了。

多線程壓測最高是消費者是4核8G的機器  單機,32條線程,最高每秒處理上千條消息。

 


免責聲明!

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



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