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

标签 java apache-kafka kafka-consumer-api distributed-computing

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

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

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

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

  3. 这种场景的行为总是确定性的吗?

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

最佳答案

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

如果您使用高级 java 消费者,那么想象以下场景:

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

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

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

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

如果你使用 Kafka 版本早于 0.9,你必须将 earliest, latest 替换为 smallest,largest.

关于java - 是什么决定了 Kafka 消费者偏移量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32390265/

相关文章:

java - 如何反转逗号后的字符串,然后打印字符串的前半部分Java

java - Google 搜索引擎仅返回 10 个结果

apache-kafka - Kafka准备好用于生产了吗?

apache-kafka - Kafka Consumer:找不到连接条目

java - 如何完全删除(核武器)javax.swing.box?

java:从文件读取时循环产生不正确的输出?

java - 无法通过 KAFKA api 连接到 EventHub

go - 重消费Kafka消息的可能原因

java - 在 Kafka 中使用实时消息

docker - Docker for Windows 上的 Kafka - 无法使用数据