主要思路:相同key值的訊息寫入同乙個partition(partition內的訊息是有序的),乙個partition的訊息只會被乙個消費者消費。
如果乙個消費者是多個執行緒消費,則需要把pull來的訊息按照key值寫入不同的記憶體佇列中,相同key值的訊息寫入同乙個記憶體佇列(記憶體佇列內的訊息是有序的),然後乙個執行緒消費乙個記憶體佇列。
1、rabbitmq
問題分析:
如圖,data1 和 data2 是有順序的,必須 data1 先執行,data2 後執行;這兩個資料被不同的消費者消費到了,可能 data2 先執行,data1 後執行,這樣原來的順序就錯亂了。
解決方案:
如圖,在 mq 裡面建立多個 queue,同一規則的資料(對唯一標識進行 hash),有順序的放入 mq 的 queue 裡面,消費者只取乙個 queue 裡面獲取資料消費,這樣執行的順序是有序的。或者還是只有乙個 queue 但是對應乙個消費者,然後這個消費者內部用記憶體佇列做排隊,然後分發給底層不同的 worker 來處理。
2、kafka
問題分析:
如圖,在 kafka 中,你對資料指定某個 key,那麼這些資料會到同乙個 partition 裡面,在 partition 裡面這些資料是有順序的。從這裡看沒啥問題,插入到資料庫的資料都是有序的。
但是,我們在消費端可能會使用多執行緒來處理,因為單執行緒的處理速度慢,為了加快處理時間和吞吐量,會使用 thread 來處理。在消費端加入執行緒之後,就會出現順序不一致的情況。
如圖,就是使用了多執行緒之後,資料順序不一致情況。
在使用了多執行緒之後,如何來解決資料順序問題?
如圖,在消費端使用記憶體佇列,佇列裡的資料使用 hash 進行分發,每個執行緒對應乙個佇列,這樣可以保證資料的順序。
如圖,生產者中把 orderid 進行取模,把相同模的資料放到 messagequeue 裡面,消費者消費同乙個 messagequeue,只要消費者這邊有序消費,那麼可以保證資料被順序消費。
如圖,activemq 裡面有 messagegroups 屬性,可以指定 jmsxgroupid,消費者會消費指定的 jmsxgroupid。即保證了順序性,又解決負載均衡的問題。
**:
如何保證訊息佇列順序執行?
其實這個也是用 mq 的時候必問的話題,第一看看你了不了解順序這個事兒?第二看看你有沒有辦法保證訊息是有順序的?這是生產系統中常見的問題。我舉個例子,我們以前做過乙個 mysqlbinlog同步的系統,壓力還是非常大的,日同步資料要達到上億,就是說資料從乙個 mysql 庫原封不動地同步到另乙個 m...
Kafka如何保證訊息的順序性
摘抄自 kafka的消費組的組員最多增加到和partition數量一致,超過的組員只會占用資源,而不起作用 kafka的partition的個數一定要大於消費組組員的個數,並且partition的個數對於消費組組員取模一定要為0,不然有些消費者會占用資源卻不起作用 我們一般將消費組裡組員的個數設定為...
kafka保證訊息順序性
順序保證 kafka 可以保證同乙個分割槽裡的訊息是有序的。也就是說,如果生產者按照一定的順序傳送訊息,broker 就會按照這個順序把它們寫入分割槽,消費者也會按照同樣的順序讀取它們。1.單分割槽 2.如果把 retries 設為非零整數,必須把 max.in.flight.requests.pe...