什么决定卡夫卡消费者的抵消?

时间:2015-09-04 04:46:50

标签: java distributed-computing apache-kafka

我对卡夫卡比较新。我已经做了一些实验,但有一些事情我不清楚消费者抵消。从我到目前为止所理解的情况来看,当消费者开始时,它将开始读取的偏移量由配置设置auto.offset.reset确定(如果我错了,请纠正我)。

现在假设主题中有10条消息(偏移0到9),并且消费者在它失败之前(或者在我杀死消费者之前)恰好消耗了其中的5条消息。然后说我重启那个消费者流程。我的问题是:

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

  2. 如果auto.offset.reset设置为largest,是否会从偏移5开始消费?

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

  4. 如果我的问题中的任何内容不清楚,请不要犹豫。提前谢谢。

3 个答案:

答案 0 :(得分:211)

它比你描述的要复杂一点。如果您的使用者组没有在某处提交有效的偏移量,则auto.offset.reset配置仅启动(2个支持的偏移存储现在是Kafka和Zookeeper)。它还取决于您使用的消费者类型。

如果你使用高级java消费者,那么想象下面的场景:

  1. 您的消费者群体group1中的消费者已消耗了5条消息并已死亡。下次启动此消费者时,它甚至不会使用auto.offset.reset配置,并将从它死亡的地方继续,因为它只会从偏移存储(Kafka或ZK,如我所述)中获取存储的偏移量。

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

  3. 影响什么偏移值将对应于smallestlargest配置的另一件事是日志保留策略。想象一下,您的主题保留配置为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 也开始