Apache kafka 提高卡夫卡制作人的绩效

Apache kafka 提高卡夫卡制作人的绩效,apache-kafka,Apache Kafka,我们在ApacheKafka 0.10.0.x和Spring3.x上运行,不能使用SpringKafka,因为SpringFramework版本4.x支持它 因此,我们使用本机Kafka Producer API生成消息 现在我关心的是我的制片人的表现。问题是,我相信调用producer.send可以真正连接到Kafka代理,然后将消息放入缓冲区,然后尝试发送,然后可能调用producer.send()中提供的回调方法 现在KafkaProducer文档说它使用一个缓冲区和另一个I/O线程来执行

我们在ApacheKafka 0.10.0.x和Spring3.x上运行,不能使用SpringKafka,因为SpringFramework版本4.x支持它

因此,我们使用本机Kafka Producer API生成消息

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

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

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


如果我错了,请纠正我的理解,或者建议更好地使用卡夫卡producer?

卡夫卡producer的两个重要配置参数是“batch.size”和“linger.ms”。因此,您基本上有一个选择:您可以等到生产者批次已满,或者生产者超时

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

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


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

你的理解部分正确

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

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

实际上,您可以使用
connections.max.idle.ms
参数(默认为9分钟)来调整制作者将保持这种连接的时间


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

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

1) 如果唱片到达的速度比卡夫卡制作人发送的速度快

2) 如果你在各自的主题中有大量的数据,这对你的卡夫卡制作人来说确实是一个负担

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");


好-这很有帮助,我可以调整属性并适当使用它们。是否有推荐的方法将其用于spring?我的意思是,我在考虑将KafkaProducer创建为一个单实例bean,然后在需要的地方注入它,但在这种情况下,会不会出现资源泄漏或性能影响?使用KafkaProducer的推荐方法是拥有一个实例并在线程之间共享它。所以实际上,你计划做的似乎是好的。至少几年前我还在使用Spring的时候,我会这么做。不知道在此期间,Spring惯用的做类似事情的方式是否发生了变化。顺便说一句,如果你认为答案令人满意,请接受。