Kafka是由LinkIn開源的實時數據處理框架,目前已經更新到2.3版本。不同於一般的消息中間件,Kafka通過數據持久化和磁碟讀寫獲得了極高的吞吐量,並可以不依賴Storm,SparkStreaming的流處理平臺,自己進行實時的流處理。 Kakfa的Offset機制是其最核心機制之一, ...
Kafka是由LinkIn開源的實時數據處理框架,目前已經更新到2.3版本。不同於一般的消息中間件,Kafka通過數據持久化和磁碟讀寫獲得了極高的吞吐量,並可以不依賴Storm,SparkStreaming的流處理平臺,自己進行實時的流處理。
Kakfa的Offset機制是其最核心機制之一,由於API對於部分功能的實現,我們有時並沒有手動去設置Offset,那麼Kafka到底有幾個Offset呢?
一、生產者Offset
首先,我們先來看生產者的offset,我們知道Kafka是通過生產者將消息發送給某一個topic,消費者再消費這個topic的消息,當然可能有多個生產者,多個消費者,還可能有消費者組的概念,這個稍後在討論。
當生產者將消息發送給某一個topic時,要看有多少個分區,因為kafka是通過分區機制實現分散式的。
圖生產者offset
通過此圖可以清晰的看到生產者的offset原理,不管是多少個生產者,還是我們規定了他們會寫入哪一個分區,但只要他們寫入的時候,一定是每一個分區都有一個offset,這個offset就是生產者的offset,同時也是這個分區的最新最大的offset。
有些時候我們在開發生產者代碼時並沒有指定某一個分區的offset,可能是我們使用的單分區,或者預設均勻的寫入多個分區,這個工作kafka幫我們完成了。
二、消費者Offset
再來看消費者端offset,要稍微複雜一些。
圖 消費者offset
這是某一個分區的offset情況,我們已經知道生產者寫入的offset是最新最大的值也就是12,而當Consumer A進行消費時,他從0開始消費,一直消費到了9,他的offset就記錄在了9,Consumer B就紀錄在了11。等下一次他們再來消費時,他們可以選擇接著上一次的位置消費,當然也可以選擇從頭消費,或者跳到最近的記錄並從“現在”開始消費。
這樣即使有多個分區,消費者也能靈活使用。
圖 消費者組
消費者組的概念其實並不影響對offset的理解,上面的情況Consumer A,Consumer B如果是同組就不能同時消費一個分區的消息,不同組的消費者可以同時消費一個分區的消息。
還有一種offset的說法,就是consumer消費未提交時,本地是有另外一個offset的,這個offset不一定與集群中記錄的offset一致。
所以,kafka每一個topic分區和生產者,消費者不同,是有多個offset的。
總結如下:
offset是指某一個分區的偏移量。
topic partition offset 這三個唯一確定一條消息。
生產者的offset其實就是最新的offset。
消費者的offset是他自己維護的,他可以選擇分區最開始,最新,也可以記住他消費到哪了。
消費者組是為了不同組的消費者可以同時消費一個分區的消息。
更多Kafka相關技術文章:
什麼是Kafka?
Kafka監控工具彙總
Kafka快速入門
Kafka核心之Consumer
Kafka核心之Producer
更多實時計算,Flink,Kafka等相關技術博文,歡迎關註實時流式計算