Kafka Topic Partition Offset 這一長串都是啥?
摘要:Offset 偏移量,是針對於單個partition存在的概念。
本文分享自華為雲社區《Kafka Topic Partition Offset 這一長串都是啥?》,作者: gentle_zhou。
Kafka,作為一款分散式消息發布和訂閱系統,被廣泛應用於大數據傳輸場景;因為其高吞吐量、內置分區、冗餘及容錯性的特點,可謂是一個很好的大規模消息處理應用的解決方案(行為追蹤,日誌收集)。
基本架構組成
Kafka里幾有如下大基本要素:
- Producer:消息生產者,向Kafka cluster內的Broker發送消息;位於客戶端內
- Kafka cluster:包含了1個或多個broker的集群
- broker:消息中間件處理節點,一個broker就是一個Kafka節點,一個broker里會有1個或多個Topic
- Topic:主題,Kafka根據topic對消息進行歸類;發布到Kafka集群的每條消息都需要指定一個topic
- ZooKeeper cluster:一個分散式服務協調框架,管理和協調整個Kafka 集群
- Consumer:消息消費者,向Kafka cluster內的Broker那讀取消息;位於客戶端內;每個Consumer屬於一個特定的Consumer Group
- Consumer Group:消息消費者組,多個不同的Consumer Group可以消費同一個消息,但是同一個Consumer Group中的不同Consumer不能消費同一個消息
以上幾個元素它們之間是如何協調運作的呢? Producer會將消息通過push 模式發布到到Kafka Clustr內的broker,consumer則通過監聽把消息通過pull 模式從 broker 那訂閱並消費。 而zookeeper則用來管理和協調整個Kafka 集群。
好,解釋了這些基本、表面的概念,我們回到標題這一長串,「Kafka Topic Partition Offset」。Topic作為一個消息的邏輯概念,同類的消息會被存到同一個topic下;每個 topic 可以有多個生產者向它發送消息,也可以有多個消費者去消費其中的消息。那麼為何topic下會有1個或則多個partition呢?
Partition
Partition 分區,在一個 topic 內,可以劃分為1個或多個分區。
它其實是一個有序的消息隊列,消息會按照按順序被添加到一個叫做commit log的文件中;一個commit log文件就對應一個partition。同一個topic下不同分區包含的消息是不同的。
下圖中的p0,p1,p2就是3個分區:
Offset
Offset 偏移量,是針對於單個partition存在的概念。partition中的消息不止一個,根據進來的順序,都會分配到一個唯一的編號即offset,用來標示某個分區中的唯一的message。
比如上圖中p0分區里的0,1就是兩條消息,p1分區里的0,1,2就是三條消息。offset的順序不跨分區,這個順序只保證在同一個分區內的消息是有序的,不同的分區內消息的offset可能是相同的。
對於消費者來說,每次消費了分區內一個消息並且提交以後,就會保存當前消費了的最近的一個 offset記錄,就不會再去消費已經消費過了的消息了。
為何要搞分區呢?
- 如果以消息日誌文件的形式來保存,那麼就會受到所在機器的文件系統大小的限制;Topic 分區之後,理論上一個topic可以處理任意數量的消息數據
- 提高並行度,針對大數據場景,kafka應用了分散式存儲的思想,把Topic劃分為很多個Partition,不同的分區還可以存在不同的集群機器節點上
參考鏈接