kafka生产者块在忙于发送给Kafka经纪人时是否将更多消息附加到缓冲区中

问题描述 投票:0回答:1

这是我当前为kafka制作人设置的设置-

batch.size = 5000000   # 5MB
linger.ms  = 1000      # 1s
max.block.ms = 10000   # 10s

通过此设置,我能够实现20k msg /秒的吞吐量。但是,我在四核处理器上的CPU利用率仍然限制为70%。我试图增加我的http请求线程(netty IO)无济于事。当卡夫卡生产者正忙于将当前批处理刷新到卡夫卡代理时,卡夫卡生产者是否阻止将新消息附加到缓冲区?我的服务器非常简单-从请求中读取消息,向其中添加一些参数,然后追加到kafka队列中。还有什么其他原因会导致随着Netty线程数量的增加,CPU利用率无法提高以获得更高的吞吐量?

apache-kafka netty throughput
1个回答
0
投票

并行生产者请求的数量受到默认为max.in.flight.requests.per.connection的配置5的限制。

config docs中说:

<,客户端将在单个连接上发送的未确认请求的最大数量。请注意,如果将此设置设置为大于1且发送失败,则由于重试(例如,如果启用重试),存在消息重新排序的风险。

[另外,要提高吞吐量,您可以通过不等待来自代理的任何fire-and-forget来应用acknowledgment生产者模式。这是通过将生产者配置设置为acks = 0(与默认值1相反)来完成的。但是,这将导致at-most-once传递语义。


“ Kafka生产者在忙于将当前批处理刷新到kafka代理时,是否阻止新消息被附加到缓冲区?”>

我不知道生产者线程中是否有任何阻塞。 Kafka Producer上的文档提供了更多详细信息:

生产者由一个缓冲空间池和一个I / O后台线程组成,该缓冲池保存尚未传输到服务器的记录,该I / O线程负责将这些记录转换为请求并将它们传输到集群。使用后无法关闭生产者将泄漏这些资源。

send()方法是异步的。调用时,它将记录添加到暂挂记录发送并立即返回的缓冲区中。这使生产者可以将各个记录分批处理以提高效率。

© www.soinside.com 2019 - 2024. All rights reserved.