改善Kafka Producer的性能

A_D*_*_De 2 apache-kafka

我们正在apache kafka 0.10.0.x和spring 3.x上运行,并且不能使用spring kafka,因为它在Spring Framework版本4.x中受支持。

因此,我们使用本地的Kafka Producer API生成消息。

现在,我所关心的是我的制作人的表现。事情是我相信producer.send真正是建立到Kafka代理的连接的调用,然后将消息放入缓冲区,然后尝试发送,然后可能在中调用您提供的回调方法producer.send()

现在,KafkaProducer文档说它使用一个缓冲区和另一个I / O线程来执行发送,并且应该适当地关闭它们,以免资源泄漏。

据我了解,这意味着如果我每次调用producer.send()都会发送100条消息,它将尝试连接到代理,这是一项昂贵的I / O操作。

如果我错了,可以请您纠正我的理解,或者建议使用KafkaProducer更好些?

cod*_*tsu 5

kafka生产者的两个重要配置参数是'batch.size'和'linger.ms'。因此,您基本上可以选择:您可以等到生产者批处理完成或生产者超时。

  • batch.size –这是Kafka Producer在发送前将尝试分批处理的消息数的上限(以字节为单位)。

  • linger.ms –生产者将在发送之前等待多长时间,以允许更多消息在同一批中累积。

这取决于您的用例,但是我建议您仔细看一下这些参数。


niv*_*vox 4

您的理解部分正确。

正如 @leshkin 指出的那样,有一些配置参数可以调整KafkaProducer如何处理要发送的消息的缓冲。

然而,独立于缓冲策略,生产者将负责缓存与主题领导者代理建立的连接。

事实上,您可以使用参数调整生产者保持这种连接的时间connections.max.idle.ms(默认为 9 分钟)。

因此,为了回答您最初的问题,建立与代理的连接的 I/O 成本仅在第一次send调用时发生,并且只要您有数据要发送,就会随着时间的推移而摊销。