【问题标题】:Python Kafka consumer doesn't receive the message from beginning?Python Kafka消费者从一开始就没有收到消息?
【发布时间】:2021-01-11 05:44:53
【问题描述】:

我在我的 Windows PC 上安装了 Kafka。创建了一个主题quickstart-events 并发送了一些消息。运行带有参数--from-beginning的控制台消费者可以接收到消息。

.\bin\windows\kafka-console-consumer.bat --topic quickstart-events --from-beginning --bootstrap-server localhost:9092
Picked up JAVA_TOOL_OPTIONS: -agentpath:"C:\WINDOWS\system32\Aternity\Java\JavaHookLoader.dll"="C:\ProgramData\Aternity\hooks"
msg1
msg2
msg3
msg4

但是,使用参数auto_offset_reset='earliest' 运行 Python 代码将第一次打印消息。那么,第一次运行后它不打印任何消息?

from kafka import KafkaConsumer, KafkaProducer
consumer = KafkaConsumer('quickstart-events', bootstrap_servers=['localhost:9092'], auto_offset_reset='smallest')
for msg in consumer:
    print(msg)

【问题讨论】:

  • 我用earliest 试过了,但它仍然没有打印任何消息。控制台消费者仍在打印。
  • 我重新启动了我的电脑,现在代码可以工作了。
  • 是的,再次运行它,现在什么也没有打印出来。我没有指定任何消费者组。有没有办法让它每次都打印消息?

标签: python apache-kafka kafka-consumer-api


【解决方案1】:

TL;DR

每次您想从头开始阅读主题时都需要提供一个新的 group.id,同时保持设置 auto_offset_reset='earliest':

KafkaConsumer('quickstart-events', bootstrap_servers=['localhost:9092'], auto_offset_reset='smallest', group_id='newGroup')

如果您的代码在第一次运行时打印输出,但在后续运行中不再打印,并且在重新启动 Kafka(您的 PC)时您的问题也得到了解决,那么您就遇到了 Consumer Group 的概念强>在卡夫卡。由于这是一个非常重要的概念,我强烈建议您熟悉它here

应用程序的消费者组确保它不会两次读取消息。每个消费者都有一个消费者组名称(即使您可能不会直接在代码中看到)。消费者组的偏移位置存储在内部 Kafka 主题中。

现在重新启动 Kafka 后第一次运行代码,Kafka 还不知道消费者组并应用 auto_offset_reset 配置中提供的策略。在您的情况下,它从 earliest 可用的提交中读取。第二次运行代码时,它不需要查看此策略,因为它已经知道消费者,并且不会允许消费者再次消费该消息。

因此,如果重新启动 Kafka,消费者的这种内部知识也会消失,并再次应用 auto_offset_reset 策略。

请记住,这是一种 hack,不应该经常在生产系统上执行,因为 consumerGroups 将处于空闲状态。

作为 sid 说明:您的控制台消费者每次运行时都会创建一个新的消费者组。设置“--from-beginning”只是确保 auto_offset_reset 设置为 'earliest'。

【讨论】:

    猜你喜欢
    • 2018-09-12
    • 2020-03-14
    • 2016-05-15
    • 2020-11-15
    • 2022-08-13
    • 2017-11-29
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    相关资源
    最近更新 更多