小编典典

是什么决定了 Kafka 消费者偏移量?

all

我对卡夫卡比较陌生。我已经对它进行了一些试验,但是关于消费者补偿,我还不清楚一些事情。据我目前了解,当消费者启动时,它将开始读取的偏移量由配置设置决定auto.offset.reset(如果我错了,请纠正我)。

现在假设主题中有 10 条消息(偏移量 0 到 9),而消费者恰好在它关闭之前(或者在我杀死消费者之前)消费了其中的 5
条。然后说我重新启动该消费者进程。我的问题是:

  1. 如果auto.offset.reset设置为earliest,它是否总是从偏移量 0 开始消费?

  2. 如果auto.offset.reset设置为latest,它会从偏移量 5 开始消耗吗?

  3. 关于这种情况的行为总是确定性的吗?

如果我的问题中有任何不清楚的地方,请随时发表评论。


阅读 95

收藏
2022-06-01

共1个答案

小编典典

它比你描述的要复杂一些。
仅当您的消费者组没有在某处提交有效的偏移量时(现在支持的 2 个偏移量存储是 Kafka 和
Zookeeper),auto.offset.reset配置才会启动,并且它还取决于您使用哪种消费者。

如果您使用高级 Java 使用者,请想象以下场景:

  1. 您在一个消费者组group1中有一个消费者,该消费者已经消费了 5 条消息并死亡。下次你启动这个消费者时,它甚至不会使用那个auto.offset.reset配置,而是会从它死去的地方继续,因为它只会从偏移存储(我提到的 Kafka 或 ZK)中获取存储的偏移。

  2. 您在一个主题中有消息(如您​​所描述的),并且您在一个新的消费者组中启动了一个消费者group2。任何地方都没有存储偏移量,这次auto.offset.reset配置将决定是从主题的开头(earliest)开始还是从主题的结尾(latest)开始

earliest影响偏移值对应和配置的另一件事latest是日志保留策略。假设您有一个保留时间配置为 1 小时的主题。您生成 5
条消息,然后一个小时后您又发布了 5 条消息。latest偏移量仍将与上一个示例中的相同,但earliest无法保留,0因为 Kafka
已经删除了这些消息,因此最早可用的偏移量将是5.

上面提到的一切都与它无关SimpleConsumer,每次运行它时,它都会决定从哪里开始使用auto.offset.reset配置。

如果您使用 Kafka 版本早于 0.9,则必须将 ,earliest替换latestsmallest, largest

2022-06-01