消息不随kafka python一起提供

时间:2017-07-09 13:29:05

标签: python apache-kafka kafka-python

我正在尝试使用kafka-python设置一个简单的Kafka应用程序。我一直试图让我在网上找到的一些例子工作但似乎无法实现。我有一个在docker容器中运行的kafka实例。我测试了shell工具,实例肯定在工作。我能够发送和接收消息。我怀疑生产者的消息超时了。以下是两个版本的代码,基本上具有相同的行为:

import time
from kafka import SimpleProducer, KafkaClient
#  connect to Kafka
kafka = KafkaClient('localhost:9092')
producer = SimpleProducer(kafka)
# Assign a topic
topic = 'test'
producer.send_messages(topic, b'this is a message')

第二个版本:

from kafka import KafkaProducer
from kafka.errors import KafkaError

producer = KafkaProducer(bootstrap_servers=['0.0.0.0:9092'], api_version=(0,10))
topic = "test"

producer.send(topic, b'test message')

2 个答案:

答案 0 :(得分:1)

这取决于您如何运行docker,但我相信您的问题与您尝试连接的主机名有关。您需要指向ADVERTISED_HOST环境变量中的主机集。例如,当我将kafka-docker作为docker run --hostname kafka-1 -p 2181:2181 -p 9092:9092 --env ADVERTISED_HOST='kafka-1' --env ADVERTISED_PORT=9092 spotify/kafka运行时,我就像这样生成kafka

from kafka import SimpleProducer, KafkaClient

kafka = KafkaClient('kafka-1:9092')
producer = SimpleProducer(kafka)
topic = 'test'
for i in range(100):
    producer.send_messages(topic, 'hullo-' + str(i))

另外我需要将127.0.0.1 kafka-1添加到我的/etc/hosts文件中。执行此操作后,我能够使用bin/kafka-console-consumer.sh --bootstrap-server kafka-1:9092 --topic test --from-beginning

来使用python客户端生成的消息

答案 1 :(得分:1)

更改行: producer.send(topic, b'test message')

收件人: producer.send(topic, b'test message').get(timeout=30)(或您认为合适的任何值)

问题在于,由于此方法是异步的,因此在发送消息之前,生产者已被杀死。 如果您添加以下内容,则可以自己查看:

import logging
logging.basicConfig(level=logging.INFO)

看到超时为0。