卡夫卡:无法消耗给定偏移量的事件

时间:2017-07-21 07:10:27

标签: apache-kafka

我只是关注quick start guide for Kafka,我决定稍微测试偏移量。

我对默认配置所做的唯一修改是添加:

log.retention.minutes=5

我的test主题是尽可能基本创建的,如快速入门指南(1分区,复制因子1)中所述:

$ bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test

我已制作了一些邮件,m1m2(在之前和之后添加日期):

$ date
viernes, 21 de julio de 2017, 12:16:06 CEST
$ bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
>m1
>m2
>^C
$ date
viernes, 21 de julio de 2017, 12:16:25 CEST

问题是我能够从头开始使用它们,但是我无法在给定偏移量的情况下使用它们(例如,偏移0,我理解指向第一条消息):

$ date
viernes, 21 de julio de 2017, 12:16:29 CEST
$ bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --offset 0 --partition 0
^CProcessed a total of 0 messages
$ date
viernes, 21 de julio de 2017, 12:17:25 CEST
$ bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
m1
m2
^CProcessed a total of 2 messages
$ date
viernes, 21 de julio de 2017, 12:17:50 CEST

我很可能从documentation

中很清楚这句话
  

实际上,基于每个消费者保留的唯一元数据是该消费者在日志中的偏移量或位置。这种偏移由消费者控制:通常消费者在读取记录时会线性地提高其偏移量,但事实上,由于消费者控制位置,它可以按照自己喜欢的任何顺序消费记录。例如,消费者可以重置为较旧的偏移量来重新处理过去的数据,或者跳到最近的记录并从“现在”开始消费。

此外,我已经看到如果在如上所述运行消费者之后产生第三条消息(m3)(即指向偏移0),则会读取第三条消息:

$ bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --offset 0 --partition 0
m3

请问有人解释这种行为吗?谢谢!

2 个答案:

答案 0 :(得分:4)

好的,经过大量评论和一些代码搜索,我认为这就是发生的事情:

当您将保留期限配置为5分钟时,您导致Kafka删除了一些旧消息 - 最明显的是偏移量为0.因此,在某个时间点,分区0中的最小偏移量变为4 。 当您使用--from-beginning启动控制台使用者时,它在内部calls a method将初始偏移初始化为可在分区中找到的最小偏移量 - 在这种情况下为4。使用该偏移量,消费者开始轮询并接收该消息以及所有后续消息,这是该分区的所有消息。

如果启动使用--offset 0的消费者,则绕过该段代码并且消费者轮询偏移量为0 - 代理会以 OFFSET_OUT_OF_RANGE 错误响应该消息。消费者在收到有问题的分区的错误resets the offset时,为此它使用参数 auto.offset.reset ,理论上它可以最早最新。 但是,due to the way that the ConsoleConsumer is written,将此参数设置为最早的唯一方法是,如果您传递命令行参数--from-beginning - 这不能与--offset结合 - 所以实际上 auto.offset.reset 唯一可能的值是: latest 。 那么当您使用不存在的偏移量0进行轮询时,会发生的情况是对数据进行不成功的轮询,之后会出现与完全没有传递任何参数相同的行为。

希望这有帮助并且有意义。

更新:

从Kafka版本1.0开始,KAFKA-5629已更改此行为,现在应该更符合预期。

答案 1 :(得分:0)

您可以尝试:--offset earliest