卡夫卡生产者冲洗和民意调查之间的区别

时间:2018-10-01 11:05:34

标签: python apache-kafka kafka-producer-api confluent-kafka

我们有一个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)

是否会有任何性能改善?你能澄清我的理解吗?

谢谢

1 个答案:

答案 0 :(得分:3)

flush()poll()之间的区别在客户的documentation中进行了说明。

对于flush(),它指出:

  

等待生产者队列中的所有消息被传递。这是一个   调用poll()直到len()为零或   可选的超时时间结束。

对于poll()

  

轮询生产者的事件并调用相应的回调   (如果已注册)。

poll()之后立即调用send()并不能使生产者同步,因为刚发送的消息不太可能已经到达代理并且交付报告已经发送回了客户。

相反,flush()将阻塞,直到先前发送的消息已传递(或出错)为止,从而有效地使生产者同步。