我们运行的是ApacheKafka 0.10.0.x和Spring3.x,不能使用SpringKafka,因为SpringFramework版本4.x支持它。
因此,我们使用本机kafka producer api来生成消息。
现在我关心的是我的制片人的表现。问题是我相信 producer.send
是什么真正建立到kafka代理的连接,然后将消息放入缓冲区,然后尝试发送并可能调用 producer.send()
.
现在kafkaproducer文档说它使用一个缓冲区和另一个i/o线程来执行发送,并且应该适当地关闭它们,这样就不会出现资源泄漏。
据我所知,这意味着如果每次调用 producer.send()
它试图连接到代理,这是一个昂贵的i/o操作。
如果我错了,你能纠正我的理解吗?或者你能建议一个更好的使用Kafka的方法吗?
3条答案
按热度按时间fbcarpbf1#
你的理解部分正确。
正如@leshkin所指出的,有一些配置参数可以调整kafkaproducer如何处理要发送的消息的缓冲。
但是,独立于缓冲策略,生产者将负责缓存到主题引导代理的已建立连接。
实际上,您可以使用
connections.max.idle.ms
参数(默认为9分钟)。因此,为了回答您最初的问题,与代理建立连接的i/o成本只发生在第一个阶段
send
只要您有数据要发送,调用和将随时间摊销。jc3wubiy2#
kafka producer的两个重要配置参数是'batch.size'和'linger.ms'。因此,您基本上有一个选择:您可以等到生产商批次已满,或者生产商超时。
batch.size–这是kafka producer在发送前尝试批处理的消息数的上限–以字节为单位指定。
linger.ms–生产者在发送之前要等待多长时间,以便在同一批中累积更多的消息。
这取决于您的用例,但我建议您仔细研究一下这些参数。
hjzp0vay3#
在以下情况下,您需要在kafka prodocer中配置batch.size、linger.ms和compression.type属性以提高性能。
1) 如果唱片到达的速度比Kafka制作人发送的速度快。
2) 如果你有大量的数据在你各自的主题,它真的负担你的Kafka生产者。
3) 如果你有瓶颈
Kafka·佐内
性能调优
Kafka表演