提高卡夫卡制片人的表现

时间:2017-08-09 20:48:27

标签: apache-kafka

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:5)

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

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

  • linger.ms - 生产者在发送之前等待多长时间,以便允许更多邮件在同一批次中累积。

这取决于您的使用案例,但我建议您仔细查看这些参数。

答案 1 :(得分:3)

你的理解是正确的。

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

然而,与缓冲策略无关,生产者将负责缓存与主题领导经纪人建立的连接。

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

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

答案 2 :(得分:0)

在以下情况下,您需要在kafka prodocer中配置batch.size,linger.ms和compression.type属性,以提高性能。

1)如果到达记录的速度比kafka生产者可以发送的速度快。

2)如果您各自的主题中有大量数据,则这确实给您的kafka生产者带来负担。

3)如果您有瓶颈

batch.size = 16_384 * 4
 linger.ms 200
compression.type = "snappy"

props.put(ProducerConfig.BATCH_SIZE_CONFIG, 16_384 * 4);
    // Send with little bit buffering
    props.put(ProducerConfig.LINGER_MS_CONFIG, 200);    
  //Use Snappy compression for batch compression.
    props.put(ProducerConfig.COMPRESSION_TYPE_CONFIG, "snappy");

kafka Dzone

Performance tunning

Kafka Perforamnce tunning