簡體   English   中英

什么決定了Kafka消費者偏移量?

[英]What determines Kafka consumer offset?

我對卡夫卡比較陌生。 我已經對它進行了一些試驗,但是關於消費者抵消,我還不清楚一些事情。 據我目前所了解,當消費者啟動時,它將開始讀取的偏移量由配置設置auto.offset.reset (如果我錯了,請糾正我)。

現在假設主題中有 10 條消息(偏移量 0 到 9),並且消費者在它關閉之前(或在我殺死消費者之前)碰巧消耗了其中的 5 條消息。 然后說我重新啟動該消費者進程。 我的問題是:

  1. 如果auto.offset.reset設置為earliest ,它是否總是從偏移量 0 開始消耗?

  2. 如果auto.offset.reset設置為latest ,它會從偏移量 5 開始消耗嗎?

  3. 關於這種場景的行為總是確定性的嗎?

如果我的問題中有任何不清楚的地方,請隨時發表評論。

它比您描述的要復雜一些。
auto.offset.reset配置僅在您的消費者組沒有在某處提交的有效偏移量時啟動(現在支持的 2 個偏移存儲是 Kafka 和 Zookeeper),並且它還取決於您使用的消費者類型。

如果您使用高級 Java 消費者,請想象以下場景:

  1. 您在消費組group1中有一個消費者,該消費者已經消費了 5 條消息並死亡。 下次你啟動這個消費者時,它甚至不會使用那個auto.offset.reset配置, auto.offset.reset從它死的地方繼續,因為它只會從偏移存儲(如我提到的 Kafka 或 ZK)中獲取存儲的偏移量。

  2. 您在一個主題中有消息(如您​​所描述的),並且您在一個新的消費者組group2啟動了一個消費者。 任何地方都沒有存儲偏移量,這次auto.offset.reset配置將決定是從主題的開頭( earliest )還是從主題的結尾( latest )開始

影響earliestlatest配置對應的偏移值的另一件事是日志保留策略。 假設您有一個保留時間配置為 1 小時的主題。 您發布了 5 條消息,然后一小時后又發布了 5 條消息。 latest偏移量仍然與前面的示例相同,但earliest偏移量不能為0因為 Kafka 已經刪除了這些消息,因此最早的可用偏移量將是5

上面提到的所有內容都與SimpleConsumer無關,每次運行它時,它都會決定從哪里開始使用auto.offset.reset配置。

如果您使用 0.9 之前的 Kafka 版本,則必須將earliestlatest替換為smallestlargest

只是更新:從 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM