深刻了解Kafka【四】消費者的Offset管理


一、Offset Topic

Consumer經過提交Offset來記錄當前消費的最後位置,以便於消費者發生崩潰或者有新的消費者加入消費者組,而引起的分區再均衡操做,每一個消費者可能會分到不一樣的分區。我測試的kafka版本是:0.11.0.2,消費者往一個特殊的主題「_consumer_offset」發送消息,如圖: offset topic.png異步

消息的內容包括:測試

fields content
Key Consumer Group, topic, partition
Payload Offset, metadata, timestamp

提交到「_consumer_offset」主題的消息會根據消費組的key進行分區,一個消費組內的全部消息,都會發送到惟一的Partition。 offset topic-邏輯圖.pngblog

二、Offset Commit

Offset的提交邏輯其實和普通的生產者往kafka發送數據是同樣的。接口

2.一、Consumer

消費者啓動時會爲「_consumer_offset」主題建立一個內置的生產者,用於Offset數據的提交。kafka

2.二、Broker

就是將Offset提交當成是正常的生產請求,邏輯不變。 offset topic commit.png同步

「_consumer_offset」主題會在集羣中的第一個Offset提交請求時被自動建立。it

三、Offset的提交方式

Offset提交時會有兩個問題:重複消費和漏消費。io

  • 當提交的Offset小於客戶端處理的最後一條消息的Offset,會形成重複消費。 情景:先消費,後提交Offset,若是消費成功、提交失敗,消費者下次獲取的Offset仍是之前的,因此會形成重複消費。
  • 當提交的Offset大於客戶端處理的最後一條消息的Offset,會形成漏消費。 情景:先提交Offset,後消費,若是提交成功、消費失敗,消費者下次獲取的Offset已是新的,因此會形成漏消費。

根據具體的業務狀況,選擇合適的提交方式,能夠有效的解決掉重複消費和漏消費的問題。table

3.一、自動提交

自動提交是最簡單的提交方式,經過設置參數,能夠開啓自動提交也能夠設置提交的時間間隔。缺點就是,當消費了一些數據後,還未達到自動的提交時間,這個時候,有新的消費者加入,或者當前消費者掛掉,會出現分區再均衡操做,以後消費者從新在上一次提交的Offset開始消費,形成重複消費。雖然能夠縮短自動提交間隔,可是仍是沒法解決這個問題。集羣

3.二、同步提交當前Offset

關閉手動提交,能夠經過同步提交接口來提交當前的Offset,雖然能夠獲取主動性,可是也犧牲了吞吐量,由於同步提交必然是阻塞的,並且會有重試機制。

3.三、異步提交當前Offset

使用異步提交方式,既有主動性,也能夠增長kafka消費的吞吐量,沒有重試機制,也解決不掉重複消費的問題。

3.四、同步和異步組合提交

正常使用的時候使用異步提交,速度快。當要關閉消費者的時候,使用同步提交,即便失敗了也會一直重試,直到提交成功或者發生沒法恢復的錯誤。無論是同步提交仍是異步提交都避免不了重複消費和漏消費的問題。

3.五、提交指定的Offset

由於自動提交、同步提交與異步提交都是將最後一個Offset提交上去。經過提交指定的Offset,能夠減輕重複消費和漏消費的問題,可是相應的消費端就須要複雜的業務處理,並且須要本身維護Offset。

tencent.jpg

相關文章
相關標籤/搜索