Kafka如何保證訊息的順序性

2022-07-01 12:57:12 字數 1790 閱讀 8520

摘抄自:

kafka的消費組的組員最多增加到和partition數量一致,超過的組員只會占用資源,而不起作用;

kafka的partition的個數一定要大於消費組組員的個數,並且partition的個數對於消費組組員取模一定要為0,不然有些消費者會占用資源卻不起作用;

我們一般將消費組裡組員的個數設定為和partition的數量相同。

訊息順序錯亂問題

我們都知道kafka是分布式多partition的,它會將乙個topic中的訊息盡可能均勻的分發到每個partition上。那麼問題就來了,這樣怎麼保證同乙個topic訊息的順序呢?

由於消費者是並行處理訊息的,我們就無法保證訊息的順序性。

如何傳送順序訊息

這個其實也很簡單。

kafka可以通過partitionkey,將某類訊息寫入同乙個partition,乙個partition只能對應乙個消費執行緒,以保證資料有序。

也就是說生產者在寫訊息的時候,可以指定乙個 key,比如說我們指定了某個訂單 id 作為 key,那麼這個訂單相關的資料,一定會被分發到同乙個 partition 中去,而且這個 partition 中的資料一定是有順序的。

kafka如何保證單partition有序?

producer發訊息到佇列時,通過加鎖保證有序。

那麼是否有這樣乙個問題呢?

先後兩條訊息傳送時,前一條訊息傳送失敗,後一條訊息傳送成功,然後失敗的訊息重試後傳送成功,造成亂序。

為了解決重試機制引起的訊息亂序為實現producer的冪等性,kafka引入了producer id(即pid)和sequence number。

對於每個pid,該producer傳送訊息的每個都對應乙個單調遞增的sequence number。

同樣,broker端也會為每個維護乙個序號,並且每commit一條訊息時將其對應序號遞增。

對於接收的每條訊息,如果其序號比broker維護的序號大一,則broker會接受它,否則將其丟棄

如果訊息序號比broker維護的序號差值比一大,說明中間有資料尚未寫入,即亂序,此時broker拒絕該訊息

如果訊息序號小於等於broker維護的序號,說明該訊息已被儲存,即為重複訊息,broker直接丟棄該訊息

傳送失敗後會重試,這樣可以保證每個訊息都被傳送到broker

消費者從 partition 中取出來資料的時候,也一定是有順序的。到這裡,順序還是 ok 的,沒有錯亂。

但是消費者這裡還是可能會有多個執行緒來併發來處理訊息,因為如果消費者是單執行緒消費資料,那麼這個吞吐量太低了。而多個執行緒併發的話,順序可能就亂掉了。

解決方案

消費者端建立多個記憶體佇列,具有相同 key 的資料都路由到同乙個記憶體 佇列;然後每個執行緒分別消費乙個記憶體佇列即可,這樣就能保證順序性。

kafka保證訊息順序性

順序保證 kafka 可以保證同乙個分割槽裡的訊息是有序的。也就是說,如果生產者按照一定的順序傳送訊息,broker 就會按照這個順序把它們寫入分割槽,消費者也會按照同樣的順序讀取它們。1.單分割槽 2.如果把 retries 設為非零整數,必須把 max.in.flight.requests.pe...

Kafka 訊息佇列如何保證順序性?

主要思路 相同key值的訊息寫入同乙個partition partition內的訊息是有序的 乙個partition的訊息只會被乙個消費者消費。如果乙個消費者是多個執行緒消費,則需要把pull來的訊息按照key值寫入不同的記憶體佇列中,相同key值的訊息寫入同乙個記憶體佇列 記憶體佇列內的訊息是有序...

如何保證訊息的順序性?

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