我们有一个Kafka用户,它将阅读消息并进行处理,然后使用以下脚本再次发布到Kafka主题
生产者配置:
{
"bootstrap.servers": "localhost:9092"
}
我没有配置任何其他配置,例如queue.buffering.max.messages
queue.buffering.max.ms
batch.num.messages
我假设所有这些都将是configuration的默认值
queue.buffering.max.messages : 100000
queue.buffering.max.ms : 0
batch.num.messages : 10000
我的理解:当内部队列达到queue.buffering.max.ms或batch.num.messages中的任何一个时,消息将在单独的线程中发布到Kafka。在我的配置中queue.buffering.max.ms为0,所以每当我调用generate()时,每条消息都会被发布。如果我错了,请纠正我。
我的制片人片段:
def send(topic, message):
p.produce(topic, json.dumps(message), callback=delivery_callback(err, msg))
p.flush()
来自this post的我了解到,在每个消息之后使用冲洗,生产者将成为同步生产者。如果我使用上述脚本,大约需要45毫秒才能发布到Kafka
如果我将上面的片段更改为
def send(topic, message):
p.produce(topic, json.dumps(message), callback=delivery_callback(err, msg))
p.poll(0)
是否会有任何性能改善?你能澄清我的理解吗?
谢谢
答案 0 :(得分:3)
flush()
和poll()
之间的区别在客户的documentation中进行了说明。
对于flush()
,它指出:
等待生产者队列中的所有消息被传递。这是一个 调用poll()直到len()为零或 可选的超时时间结束。
对于poll()
:
轮询生产者的事件并调用相应的回调 (如果已注册)。
在poll()
之后立即调用send()
并不能使生产者同步,因为刚发送的消息不太可能已经到达代理并且交付报告已经发送回了客户。
相反,flush()
将阻塞,直到先前发送的消息已传递(或出错)为止,从而有效地使生产者同步。