Kafka Producer中batch.size和linger.ms参数的含义?

生产者发送多个消息到同一个分区的时候,为了减少网络带来的系能开销,kafka会对消息进行批量发送。

一、batch.size 参数

通过这个参数来设置批量发送的数据大小,默认是16k,当积压的消息达到这个值的时候就会统一发送(发往同一分区的消息)。

二、linger.ms 参数

这个是设置消息发送延迟,这样可以收集更多的消息后批量发送,默认大小是0ms(就是有消息就立即发送)。

当这两个参数同时设置的时候,只要两个条件中满足一个就会发送。比如说batch.size设置16kb,linger.ms设置50ms,那么当消息积压达到16kb就会发送,如果没有到达16kb,那么在第一个消息到来之后的50ms之后消息将会发送。

Kafka Producer中batch.size和linger.ms参数的含义?

三、max.request.size 参数

默认是1M,请求的最大字节数。

Kafka Producer中batch.size和linger.ms参数的含义?

一旦设置了linger.ms,当producer负载很低的时候batch被填满的速度就会很慢,此时Kafka producer的确会延时一段时间(linger.ms)才能将其发送出去——这是linger.ms应用的主要场景。反之,如果负载很高,甚至batch被填满的时间远低于linger.ms,那么此时linger.ms就不起任何作用了。

四、示例代码

下面是Kafka Producer 示例代码,其中设置了producer的batch.size=16kb、linger.ms=1 等等参数。

package com.rickie.kafka;

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;

import java.util.Properties;

public class ProducerParamsDemo {
 public static void main(String[] args) {
 Properties props = new Properties();
 props.put("bootstrap.servers", "localhost:9092");
 props.put("acks", "all");
 props.put("retries", 0);
 props.put("batch.size", 16384);
 props.put("linger.ms", 1);
 props.put("buffer.memory", 33554432);
 props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
 props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

 Producer<String, String> producer = new KafkaProducer<>(props);
 for(int i = 0; i < 100; i++) {
 producer.send(new ProducerRecord<String, String>("my-topic", Integer.toString(i), Integer.toString(i)));
 }
 producer.close();
 }
}

相关推荐