我们正在运行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,请你纠正我的理解吗?
答案 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");