摘要:Offset 偏移量,是針對於單個partition存在的概念。
本文分享自華為雲社群《Kafka Topic Partition Offset 這一長串都是啥?》,作者: gentle_zhou。
Kafka,作為一款分散式訊息釋出和訂閱系統,被廣泛應用於巨量資料傳輸場景;因為其高吞吐量、內建分割區、冗餘及容錯性的特點,可謂是一個很好的大規模訊息處理應用的解決方案(行為追蹤,紀錄檔收集)。
Kafka裡幾有如下大基本要素:
以上幾個元素它們之間是如何協調運作的呢? Producer會將訊息通過push 模式釋出到到Kafka Clustr內的broker,consumer則通過監聽把訊息通過pull 模式從 broker 那訂閱並消費。 而zookeeper則用來管理和協調整個Kafka 叢集。
好,解釋了這些基本、表面的概念,我們回到標題這一長串,「Kafka Topic Partition Offset」。Topic作為一個訊息的邏輯概念,同類的訊息會被存到同一個topic下;每個 topic 可以有多個生產者向它傳送訊息,也可以有多個消費者去消費其中的訊息。那麼為何topic下會有1個或則多個partition呢?
Partition 分割區,在一個 topic 內,可以劃分為1個或多個分割區。
它其實是一個有序的訊息佇列,訊息會按照按順序被新增到一個叫做commit log的檔案中;一個commit log檔案就對應一個partition。同一個topic下不同分割區包含的訊息是不同的。
下圖中的p0,p1,p2就是3個分割區:
Offset 偏移量,是針對於單個partition存在的概念。partition中的訊息不止一個,根據進來的順序,都會分配到一個唯一的編號即offset,用來標示某個分割區中的唯一的message。
比如上圖中p0分割區裡的0,1就是兩條訊息,p1分割區裡的0,1,2就是三條訊息。offset的順序不跨分割區,這個順序只保證在同一個分割區內的訊息是有序的,不同的分割區內訊息的offset可能是相同的。
對於消費者來說,每次消費了分割區內一個訊息並且提交以後,就會儲存當前消費了的最近的一個 offset記錄,就不會再去消費已經消費過了的訊息了。