【问题标题】:Python Producer can send via shell, but not .pyPython Producer 可以通过 shell 发送,但不能通过 .py
【发布时间】:2019-08-27 11:56:54
【问题描述】:

我有一个正在运行并经过测试的 Kafka 集群,并且正在尝试使用 Python 脚本向代理发送消息。这在我使用 Python3 shell 并调用 producer 方法时有效,但是当我将这些相同的命令放入 python 文件并执行它时 - 脚本似乎挂起。

我正在为消费者和生产者使用 kafka-python 库。当我使用 Python3 shell 时,我可以使用 Kafka GUI 工具 2.0.4 看到消息出现在主题中 我在 python 代码中尝试了各种循环和语句,但似乎没有什么可以让它“运行”到完成。

>>>from kafka import KafkaProducer
>>>producer = KafkaProducer(bootstrap_servers='BOOTSTRAP_SRV:9092')
>>>producer.send('MyTopic', b'Has this worked?')
>>>>>><kafka.producer.future.FutureRecordMetadata object at 0x7f7af9ece048>

这有效,并且字节出现在代理主题数据中。

当我将与上面相同的代码放入 python .py 文件并使用 Python3 执行时,它完成,但没有数据发送到 Kafka 代理。 也没有显示错误。

from kafka import KafkaProducer
producer = KafkaProducer(bootstrap_servers='BOOTSTRAP_SRV:9092')
producer.send('MyTopic', b'Some Data to Check')

【问题讨论】:

    标签: python python-3.x apache-kafka kafka-python


    【解决方案1】:

    如您所见,它返回一个未来。

    Kafka 客户端将批处理记录,它们不会立即一次发送一条记录,为此,您需要等待或刷新生产者缓冲区,以便在应用退出之前发送。换句话说,交互式终端将生产者数据保存在内存中,在后台运行,反之则丢弃该数据

    As the docs, show

    future = producer.send(...)
    
    try:
        record_metadata = future.get(timeout=10)
    except KafkaError:
        # Decide what to do if produce request failed...
        log.exception()
        pass
    

    或者直接输入producer.flush(),如果您不关心元数据或抓住未来。

    【讨论】:

      猜你喜欢
      • 2015-03-06
      • 2020-12-25
      • 1970-01-01
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      • 2021-06-18
      • 2018-01-10
      • 1970-01-01
      相关资源
      最近更新 更多