2017-08-09 95 views
0

我们在apache kafka 0.10.0.x和spring 3.x上运行,不能使用spring kafka,因为它支持spring framework 4.x.提高Kafka Producer的性能

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

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

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

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

如果我错了或者建议更好地使用KafkaProducer,你能纠正我的理解吗?

回答

1

你的理解是部分正确的。

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

但是独立于缓冲策略,生产者将负责缓存与主题领导者经纪人建立的连接。

的确,您可以调整制作人使用connections.max.idle.ms参数(默认为9分钟)保持这种连接的时间。

因此,为了回应您的原始问题,与代理建立连接的I/O成本只会在第一次调用send时发生,并且只要您有数据要发送,就会随着时间推移分期付款。

+0

好的 - 这有助于我调整属性并适当地使用它们。有没有推荐的方法用于春季?我的意思是我正在考虑将KafkaProducer创建为singleton bean,然后在需要的地方注入它,但是在这种情况下会出现资源泄漏或性能问题? –

+0

那么reccomendeed使用KafkaProducer的方法是有一个实例并在线程之间共享。所以实际上你打算做的事情似乎没有问题。至少在几年前,当我还在使用Spring时,我会这样做。不知道在此期间,做这种事情的春天惯用方式已经改变了。顺便说一句,如果您认为答案是令人满意的,请接受它。 – nivox

1

kafka生产者的两个重要配置参数是'batch.size'和'linger.ms'。所以你基本上有一个选择:你可以等到生产者批次满了,或者生产者超时。

  • batch.size - 这是Kafka Producer发送之前尝试批量处理的消息的上限 - 以字节为单位指定。

  • linger.ms - 制造商在发送前等待多长时间才能让更多消息在同一批次中累积。

这取决于你的用例,但我建议仔细看看这些参数。