【问题标题】:Kafka does not retrieve messages which are sent when it is offlineKafka 不检索离线时发送的消息
【发布时间】:2017-07-23 04:54:22
【问题描述】:

我已经在一台机器上设置了一个 kafka 集群并使用 kafka-console-producer.bat 和 kafka-console-producer.bat 进行测试

我启动了zookeeper、kafka-server,并使用kakfa-console-producer生成了一些测试消息,然后是kakfa-console-consumer,没有打印任何消息。

但是,如果我启动 zookeeper、kakfa-server、kakfa-console-consumer,最后启动 kakfa-console-producer 并生成测试消息,这些消息会在 kakfa-console-consumer 上打印出来。

为什么 Kafka 离线时无法接收消息?我只使用 1 个代理。

【问题讨论】:

    标签: apache-kafka


    【解决方案1】:

    Kafka 有一个称为消费者组的概念,每个消费者在连接到代理时都会加入一个。对于每个消费者组,Kafka 都会跟踪读取的最后一条消息偏移量。如果代理不知道消费者组,名为 auto.offset.reset 的消费者参数会影响发生的情况:

    • 最早:从主题的开头开始阅读消息
    • 最新:从主题的当前结尾开始读取(因此在启动消费者后会产生任何消息)

    此参数的默认值为 latest,并且由于控制台消费者随机化其消费者组,这就是您的情况会发生的情况,以及为什么您看不到在消费者之前生成的任何消息开始了。 您可以将参数 --from-beginning 添加到控制台使用者命令中,该命令用于控制此工具的此行为。然后您应该会看到所有消息。

    更新: 如果您想确保从消费者离开的地方接听,您将需要手动设置消费者组,并在每次调用消费者时保持相同。 您可以通过使用此参数创建一个文本文件并将其传递给您的控制台使用者来做到这一点。

    echo "group.id=test" > consumer.config
    ./kafka-console-consumer --topic test --new-consumer --bootstrap-server 127.0.0.1:9092 --consumer.config consumer.config
    

    【讨论】:

    • 我不希望被消费的消息再次被重新处理。我正在考虑使用我的消费者离线时发送的消息。
    • Kafka 默认保留偏移量 24 小时。代理配置offsets.retention.minutes 控制偏移保留期。如果消费者离线并且在那段时间内没有提交任何新的偏移量,那么 Kafka 可能会删除该消费者组的偏移量。
    猜你喜欢
    • 1970-01-01
    • 2015-06-02
    • 2014-05-16
    • 2023-03-10
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    相关资源
    最近更新 更多