我对 Kafka 比较陌生。我已经对它进行了一些试验,但是关于消费者补偿,我还不清楚一些事情。据我目前所了解,当消费者启动时,它将开始读取的偏移量由配置设置 auto.offset.reset
确定(如果我错了,请纠正我)。
现在假设主题中有 10 条消息(偏移量 0 到 9),而消费者恰好在它关闭之前(或在我杀死消费者之前)消费了其中的 5 条。然后说我重新启动该消费者进程。我的问题是:
如果
auto.offset.reset
设置为earliest
,是否总是从偏移量 0 开始消费?如果
auto.offset.reset
设置为latest
,它会从偏移量 5 开始消费吗?这种场景的行为总是确定性的吗?
如果我的问题中有任何不清楚的地方,请随时发表评论。
最佳答案
比你描述的要复杂一点。
auto.offset.reset
config仅当您的消费者组没有在某处提交有效的偏移量时才会启动(现在支持的 2 个偏移量存储是 Kafka 和 Zookeeper),并且它还取决于您使用哪种消费者。
如果您使用高级 java 消费者,那么想象以下场景:
您在消费者组
group1
中有一个消费者,该消费者已消费 5 条消息并死亡。下次你启动这个消费者时,它甚至不会使用那个auto.offset.reset
配置,并且会从它死去的地方继续,因为它只会从偏移存储(Kafka 或 ZK)中获取存储的偏移量正如我提到的)。您在一个主题中有消息(如您所描述的),并且您在一个新的消费者组
group2
中启动了一个消费者。任何地方都没有存储偏移量,这次auto.offset.reset
配置将决定是从主题的开头(earliest
)还是从主题的结尾开始主题(最新
)
影响与 earliest
和 latest
配置对应的偏移值的另一件事是日志保留策略。假设您有一个保留时间配置为 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/