如何保證MQ的順序性?比如Kafka

2022-03-14 13:27:48 字數 1215 閱讀 4928

1. rabbitmq

拆分多個queue,每個queue乙個consumer,就是多一些queue而已,確實是麻煩點;或者就乙個queue但是對應乙個consumer,然後這個consumer內部用記憶體佇列做排隊,然後分發給底層不同的worker來處理

2. kafka

寫入乙個partition中的資料一定是有序的,生產者在寫的時候 ,可以指定乙個key,比如指定訂單id作為key,這個訂單相關資料一定會被分發到乙個partition中去。消費者從partition中取出資料的時候也一定是有序的,把每個資料放入對應的乙個記憶體佇列,乙個partition中有幾條相關資料就用幾個記憶體佇列,消費者開啟多個執行緒,每個執行緒處理乙個記憶體佇列

如何保證訊息的順序性?

其實這個也是用 mq 的時候必問的話題,第一看看你了不了解順序這個事兒?第二看看你有沒有辦法保證訊息是有順序的?這是生產系統中常見的問題。

我舉個例子,我們以前做過乙個 mysqlbinlog同步的系統,壓力還是非常大的,日同步資料要達到上億,就是說資料從乙個 mysql 庫原封不動地同步到另乙個 mysql 庫裡面去(mysql -> mysql)。常見的一點在於說比如大資料 team,就需要同步乙個 mysql 庫過來,對公司的業務系統的資料做各種複雜的操作。

你在 mysql 裡增刪改一條資料,對應出來了增刪改 3 條binlog日誌,接著這三條binlog傳送到 mq 裡面,再消費出來依次執行,起碼得保證人家是按照順序來的吧?不然本來是:增加、修改、刪除;你楞是換了順序給執行成刪除、修改、增加,不全錯了麼。

本來這個資料同步過來,應該最後這個資料被刪除了;結果你搞錯了這個順序,最後這個資料保留下來了,資料同步就出錯了。

先看看順序會錯亂的倆場景:

rabbitmq-order-01

kafka-order-01

rabbitmq

拆分多個 queue,每個 queue 乙個 consumer,就是多一些 queue 而已,確實是麻煩點;或者就乙個 queue 但是對應乙個 consumer,然後這個 consumer 內部用記憶體佇列做排隊,然後分發給底層不同的 worker 來處理。

rabbitmq-order-02

kafka

kafka-order-02

參考:mq如何保證高可用,解決重複消費、資料丟失問題和順序性問題

參考:如何保證訊息的順序性?

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

主要思路有兩種 1 單執行緒消費來保證訊息的順序性 2 對訊息進行編號,消費者處理時根據編號判斷順序。1 rabbitmq 問題分析 如圖,data1 和 data2 是有順序的,必須 data1 先執行,data2 後執行 這兩個資料被不同的消費者消費到了,可能 data2 先執行,data1 後...

mq如何保證訊息的冪等性

一 訊息的傳送流程 二 出現非冪等性的情況 1 生產者已把訊息傳送到mq,在mq給生產者返回ack的時候網路中斷,故生產者未收到確定資訊,生產者認為訊息未傳送成功,但實際情況是,mq已成功接收到了訊息,在網路重連後,生產者會重新傳送剛才的訊息,造成mq接收了重複的訊息 2 消費者在消費mq中的訊息時...

如何保證MQ的高可用性?

1 面試題 如何保證訊息佇列的高可用啊?2 面試官心理分析 如果有人問到你mq的知識,高可用是必問的,因為mq的缺點,我剛才已經說過了,有好多,導致系統可用性降低,等等。所以只要你用了mq,接下來問的一些要點肯定就是圍繞著mq的那些缺點怎麼來解決了。要是你傻乎乎的就乾用了乙個mq,各種問題從來沒考慮...