[英]What determines Kafka consumer offset?
我對卡夫卡比較陌生。 我已經對它進行了一些試驗,但是關於消費者抵消,我還不清楚一些事情。 據我目前所了解,當消費者啟動時,它將開始讀取的偏移量由配置設置auto.offset.reset
(如果我錯了,請糾正我)。
現在假設主題中有 10 條消息(偏移量 0 到 9),並且消費者在它關閉之前(或在我殺死消費者之前)碰巧消耗了其中的 5 條消息。 然后說我重新啟動該消費者進程。 我的問題是:
如果auto.offset.reset
設置為earliest
,它是否總是從偏移量 0 開始消耗?
如果auto.offset.reset
設置為latest
,它會從偏移量 5 開始消耗嗎?
關於這種場景的行為總是確定性的嗎?
如果我的問題中有任何不清楚的地方,請隨時發表評論。
它比您描述的要復雜一些。
auto.offset.reset
配置僅在您的消費者組沒有在某處提交的有效偏移量時啟動(現在支持的 2 個偏移存儲是 Kafka 和 Zookeeper),並且它還取決於您使用的消費者類型。
如果您使用高級 Java 消費者,請想象以下場景:
您在消費組group1
中有一個消費者,該消費者已經消費了 5 條消息並死亡。 下次你啟動這個消費者時,它甚至不會使用那個auto.offset.reset
配置, auto.offset.reset
從它死的地方繼續,因為它只會從偏移存儲(如我提到的 Kafka 或 ZK)中獲取存儲的偏移量。
您在一個主題中有消息(如您所描述的),並且您在一個新的消費者組group2
啟動了一個消費者。 任何地方都沒有存儲偏移量,這次auto.offset.reset
配置將決定是從主題的開頭( earliest
)還是從主題的結尾( latest
)開始
影響earliest
和latest
配置對應的偏移值的另一件事是日志保留策略。 假設您有一個保留時間配置為 1 小時的主題。 您發布了 5 條消息,然后一小時后又發布了 5 條消息。 latest
偏移量仍然與前面的示例相同,但earliest
偏移量不能為0
因為 Kafka 已經刪除了這些消息,因此最早的可用偏移量將是5
。
上面提到的所有內容都與SimpleConsumer
無關,每次運行它時,它都會決定從哪里開始使用auto.offset.reset
配置。
如果您使用 0.9 之前的 Kafka 版本,則必須將earliest
、 latest
替換為smallest
、 largest
。
只是更新:從 Kafka 0.9 開始,Kafka 使用新的 Java 版本的消費者,並且 auto.offset.reset 參數名稱已更改; 從手冊:
當 Kafka 中沒有初始偏移量或服務器上不再存在當前偏移量(例如,因為該數據已被刪除)時該怎么辦:
最早:自動將偏移量重置為最早的偏移量
最新:自動將偏移量重置為最新的偏移量
none :如果沒有找到消費者組的先前偏移量,則向消費者拋出異常
其他任何事情:向消費者拋出異常。
在檢查了接受的答案后,我花了一些時間找到了這個,所以我認為社區發布它可能會有用。
此外還有offsets.retention.minutes。 如果自最后提交時間> offsets.retention.minutes
,然后auto.offset.reset
也踢
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.