我对卡夫卡比较新。我已经做了一些实验,但有一些事情我不清楚消费者抵消。从我到目前为止所理解的情况来看,当消费者开始时,它将开始读取的偏移量由配置设置auto.offset.reset
确定(如果我错了,请纠正我)。
现在假设主题中有10条消息(偏移0到9),并且消费者在它失败之前(或者在我杀死消费者之前)恰好消耗了其中的5条消息。然后说我重启那个消费者流程。我的问题是:
如果auto.offset.reset
设置为smallest
,是否总是从偏移0开始消费?
如果auto.offset.reset
设置为largest
,是否会从偏移5开始消费?
关于这种情况的行为是否总是确定的?
如果我的问题中的任何内容不清楚,请不要犹豫。提前谢谢。
答案 0 :(得分:211)
它比你描述的要复杂一点。如果您的使用者组没有在某处提交有效的偏移量,则auto.offset.reset
配置仅启动(2个支持的偏移存储现在是Kafka和Zookeeper)。它还取决于您使用的消费者类型。
如果你使用高级java消费者,那么想象下面的场景:
您的消费者群体group1
中的消费者已消耗了5条消息并已死亡。下次启动此消费者时,它甚至不会使用auto.offset.reset
配置,并将从它死亡的地方继续,因为它只会从偏移存储(Kafka或ZK,如我所述)中获取存储的偏移量。
您在主题中有消息(如您所述),并在新的消费者群组group2
中启动消费者。在任何地方都没有存储偏移量,这次auto.offset.reset
配置将决定是从主题的开头(smallest
)开始还是从主题的末尾开始(largest
)
影响什么偏移值将对应于smallest
和largest
配置的另一件事是日志保留策略。想象一下,您的主题保留配置为1小时。您生成5条消息,然后一小时后再发布5条消息。 largest
偏移量仍将与之前的示例相同,但smallest
的偏移量不能为0
,因为Kafka已经删除了这些消息,因此可用的最小偏移量为5
。
上面提到的所有内容都与SimpleConsumer
无关,每次运行时,都会决定从使用auto.offset.reset
配置开始。
答案 1 :(得分:67)
只是一个更新:从Kafka 0.9开始,Kafka正在使用消费者的新Java版本,并且auto.offset.reset参数名称已更改;从手册:
当卡夫卡或当前没有初始偏移时该怎么办 服务器上不再存在偏移量(例如,因为该数据 已被删除):
最早:自动将偏移重置为最早的偏移量
最新:自动将偏移重置为最新偏移量
无:如果未找到先前的偏移,则向使用者抛出异常 对于消费者群体
其他任何事情:向消费者抛出异常。
我在检查接受的答案后花了一些时间才找到这个,所以我认为社区发布它可能会有用。
答案 2 :(得分:7)
还有更多的offsets.retention.minutes。如果自上次提交以来的时间是> list
,然后 offsets.retention.minutes
也开始