如何保證mq的有序性 訊息佇列如何保證順序性?

2021-10-12 13:39:35 字數 972 閱讀 2548

主要思路有兩種:1、單執行緒消費來保證訊息的順序性;2、對訊息進行編號,消費者處理時根據編號判斷順序。

1、rabbitmq

問題分析:

如圖,data1 和 data2 是有順序的,必須 data1 先執行,data2 後執行;這兩個資料被不同的消費者消費到了,可能 data2 先執行,data1 後執行,這樣原來的順序就錯亂了。

解決方案:

如圖,在 mq 裡面建立多個 queue,同一規則的資料(對唯一標識進行 hash),有順序的放入 mq 的 queue 裡面,消費者只取乙個 queue 裡面獲取資料消費,這樣執行的順序是有序的。或者還是只有乙個 queue 但是對應乙個消費者,然後這個消費者內部用記憶體佇列做排隊,然後分發給底層不同的 worker 來處理。

2、kafka

問題分析:

如圖,在 kafka 中,你對資料指定某個 key,那麼這些資料會到同乙個 partition 裡面,在 partition 裡面這些資料是有順序的。從這裡看沒啥問題,插入到資料庫的資料都是有序的。

但是,我們在消費端可能會使用多執行緒來處理,因為單執行緒的處理速度慢,為了加快處理時間和吞吐量,會使用 thread 來處理。在消費端加入執行緒之後,就會出現順序不一致的情況。

如圖,就是使用了多執行緒之後,資料順序不一致情況。

在使用了多執行緒之後,如何來解決資料順序問題?

如圖,在消費端使用記憶體佇列,佇列裡的資料使用 hash 進行分發,每個執行緒對應乙個佇列,這樣可以保證資料的順序。

3、rocketmq

如圖,生產者中把 orderid 進行取模,把相同模的資料放到 messagequeue 裡面,消費者消費同乙個 messagequeue,只要消費者這邊有序消費,那麼可以保證資料被順序消費。

4、activemq

如圖,activemq 裡面有 messagegroups 屬性,可以指定 jmsxgroupid,消費者會消費指定的 jmsxgroupid。即保證了順序性,又解決負載均衡的問題。

訊息佇列如何確保訊息的有序性?

要想實現訊息有序,需要從 producer 和 consumer 兩方面來考慮。首先,producer 生產訊息的時候就必須要有序。然後,consumer 消費的時候,也要按順序來,不能亂。producer 有序 像 rabbitmq 這類普通的訊息系統,佇列結構簡單,producer 向佇列中傳送...

如何保證執行緒安全有序性 執行緒池如何保證有序?

在生產環境中,用kafka來解耦是常用的技術手段。為了保證訊息的順序處理,會把相同屬性 同乙個人 同乙個素材等 的訊息發往kafka同乙個partition中。例如,在廣告系統中,會把某乙個ad的轉化資料傳送到同乙個partition。ad1 ad1 msg1,ad1 msg2,順序發到partit...

如何保證執行緒安全有序性 執行緒池如何保證有序?

背景 在生產環境中,用kafka來解耦是常用的技術手段。為了保證訊息的順序處理,會把相同屬性 同乙個人 同乙個素材等 的訊息發往kafka同乙個partition中。例如,在廣告系統中,會把某乙個ad的轉化資料傳送到同乙個partition。ad1 ad1 msg1,ad1 msg2,順序發到par...