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

image

1、Offset Topic

Consumer通過提交Offset來記錄當(dāng)前消費的最后位置,以便于消費者發(fā)生崩潰或者有新的消費者加入消費者組,而引發(fā)的分區(qū)再均衡操作,每個消費者可能會分到不同的分區(qū)。我測試的kafka版本是:0.11.0.2,消費者往一個特殊的主題“_consumer_offset”發(fā)送消息,如圖:


offset topic.png

消息的內(nèi)容包括:

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

提交到“_consumer_offset”主題的消息會根據(jù)消費組的key進行分區(qū),一個消費組內(nèi)的所有消息,都會發(fā)送到唯一的Partition。


offset topic-邏輯圖.png

2、Offset Commit

Offset的提交邏輯其實和普通的生產(chǎn)者往kafka發(fā)送數(shù)據(jù)是一樣的。

2.1、Consumer

消費者啟動時會為“_consumer_offset”主題創(chuàng)建一個內(nèi)置的生產(chǎn)者,用于Offset數(shù)據(jù)的提交。

2.2、Broker

就是將Offset提交當(dāng)成是正常的生產(chǎn)請求,邏輯不變。


offset topic commit.png

“_consumer_offset”主題會在集群中的第一個Offset提交請求時被自動創(chuàng)建。

3、Offset的提交方式

Offset提交時會有兩個問題:重復(fù)消費和漏消費。

  • 當(dāng)提交的Offset小于客戶端處理的最后一條消息的Offset,會造成重復(fù)消費。
    情景:先消費,后提交Offset,如果消費成功、提交失敗,消費者下次獲取的Offset還是以前的,所以會造成重復(fù)消費。
  • 當(dāng)提交的Offset大于客戶端處理的最后一條消息的Offset,會造成漏消費。
    情景:先提交Offset,后消費,如果提交成功、消費失敗,消費者下次獲取的Offset已經(jīng)是新的,所以會造成漏消費。

根據(jù)具體的業(yè)務(wù)情況,選擇合適的提交方式,可以有效的解決掉重復(fù)消費和漏消費的問題。

3.1、自動提交

自動提交是最簡單的提交方式,通過設(shè)置參數(shù),可以開啟自動提交也可以設(shè)置提交的時間間隔。缺點就是,當(dāng)消費了一些數(shù)據(jù)后,還未達到自動的提交時間,這個時候,有新的消費者加入,或者當(dāng)前消費者掛掉,會出現(xiàn)分區(qū)再均衡操作,之后消費者重新在上一次提交的Offset開始消費,造成重復(fù)消費。雖然可以縮短自動提交間隔,但是還是無法解決這個問題。

3.2、同步提交當(dāng)前Offset

關(guān)閉手動提交,可以通過同步提交接口來提交當(dāng)前的Offset,雖然可以獲取主動性,但是也犧牲了吞吐量,因為同步提交必然是阻塞的,而且會有重試機制。

3.3、異步提交當(dāng)前Offset

使用異步提交方式,既有主動性,也可以增加kafka消費的吞吐量,沒有重試機制,也解決不掉重復(fù)消費的問題。

3.4、同步和異步組合提交

正常使用的時候使用異步提交,速度快。當(dāng)要關(guān)閉消費者的時候,使用同步提交,即使失敗了也會一直重試,直到提交成功或者發(fā)生無法恢復(fù)的錯誤。不管是同步提交還是異步提交都避免不了重復(fù)消費和漏消費的問題。

3.5、提交指定的Offset

因為自動提交、同步提交與異步提交都是將最后一個Offset提交上去。通過提交指定的Offset,可以減輕重復(fù)消費和漏消費的問題,但是相應(yīng)的消費端就需要復(fù)雜的業(yè)務(wù)處理,而且需要自己維護Offset。

tencent.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容