Kafka produce.send从不发送消息

时间:2017-07-14 00:33:18

标签: python apache-kafka kafka-python

我使用Kafka 2.12和kafka-python模块作为Kafka客户端。我正在尝试测试一个简单的制作人:

class Producer(Process):
daemon = True
def run(self):
    producer = KafkaProducer(bootstrap_servers='kafka:9092')
    print("Sending messages...")
    producer.send('topic', json.dumps(message).encode('utf-8'))

当实例化此过程时,消费者永远不会收到该消息

如果我刷新生成器并更改linger_ms参数(使其同步),消息将由消费者发送和读取:

class Producer(Process):
daemon = True
def run(self):
    producer = KafkaProducer(bootstrap_servers='kafka:9092', linger_ms=10)
    print("Sending messages...")
    producer.send('topic', json.dumps(message).encode('utf-8'))
    producer.flush()

在之前的Kafka版本中,有一个param queue.buffering.max.ms来指定生产者在队列中发送消息之前等待多长时间,但最新版本中没有它(kafka-python 1.3。 3)。我怎么能在较新的Kafka版本中指定这个以保持我的通信异常?

谢谢!

2 个答案:

答案 0 :(得分:1)

正如您所观察到的,消息排队等待异步发送,并且无法保证它会立即发送。因此,如果要强制将消息发送到代理,则需要显式调用producer.flush(),它将阻塞,直到发送消息为止(尽管flush()不保证确认消息)。

注意:由于flush()是阻止呼叫,因此通常仅推荐用于低吞吐量系统或应用程序关闭。对于大容量系统,同步发送与异步发送的吞吐量命中通常是不可行的。我的经验是生产者通常很快发送而不需要调用flush(),除了测试套件/开发你需要它立即发生的地方。

我非常确定param queue.buffering.max.ms已被linger_ms取代:https://kafka-python.readthedocs.io/en/master/apidoc/KafkaProducer.html#kafka.KafkaProducer

因此,您已经在工作示例中使用了该参数。

答案 1 :(得分:0)

producer = KafkaProducer(bootstrap_servers='kafkaIp:kafkaPort')
producer.send("topic_name", b'Your string here')
producer.flush()

使用发送和刷新。