Java-Kafka生产者性能
使用的是storm框架,并且是一个单例的kafka生产者;每次遍历一个1000元素的list,这样写是否会影响写入性能。
for (String value : list) {
kafkaProducer.send(new ProducerRecord<>(topic, value), new Callback() {
@Override
public void onCompletion(RecordMetadata metadata, Exception exception) {
if (exception != null) {
logger.error(exception);
}
}
});
}
kafkaProducer.flush();
你这个是非阻塞发送,效率是最高的,没有问题的。
flush这一步是否有必要执行呢?
flush
的作用是当你执行1000条
之后,需要执行一下flush
,为了清空你还在缓冲区待发送的消息。否则进程
直接结束了,那还在缓冲区的消息就丢失了。你也可以通过休眠几秒钟,等待这些缓冲区的消息发送出去了,不用执行
flush
了。kafka消息发送是个永不结束持续发送的流,直到销毁的那一刻,才需要清空缓存区,断开与kakfa的连接。
可以通过这个linger.ms这个参数来限制吗?
目前我的生产者配置是这样的:
acks=1 retries=0 linger.ms=5 request.timeout.ms=30000 batch.size=262144 buffer.memory=67108864 max.request.size=5242880
linger.ms
是发送到kafka之前,额外多等5ms
,等待更多的消息,然后一次性发送给kafka,具体介绍,参见:https://www.orchome.com/511
你的答案