Python Producer可以通过外壳发送,但不能通过.py发送

时间:2019-04-05 14:34:48

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

我有一个正在运行且经过测试的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')

1 个答案:

答案 0 :(得分:3)

如您所见,它返回了未来。

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()