Skip to content

08. Producer 配置详解 ​

本文档详细介绍 Kafka Producer 的所有配置参数及其影响。

目录 ​


1. 基础配置 ​

1.1 必需配置 ​

配置项类型说明
bootstrap.serverslistKafka 集群初始连接地址,格式: host1:port1,host2:port2
key.serializerclassKey 的序列化类
value.serializerclassValue 的序列化类

示例:

java
props.put("bootstrap.servers", "localhost:9092,localhost:9093");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

1.2 客户端标识 ​

配置项默认值说明
client.id""客户端标识,用于日志和监控

2. 性能优化配置 ​

2.1 批量发送 ​

配置项默认值说明调优建议
batch.size16384批量发送的字节数上限增加可提高吞吐,但会增加延迟
linger.ms0发送前等待时间设为 5-100ms 以积累更多消息
buffer.memory33554432生产者缓冲区总大小根据内存和并发量调整

调优公式:

缓冲区大小 = 单分区消息量 × 分区数 × 副本系数

2.2 压缩配置 ​

配置项默认值可选值说明
compression.typenonenone/gzip/snappy/lz4/zstd消息压缩类型

压缩算法对比:

算法压缩比CPU 占用建议场景
none1x无内网、低延迟场景
snappy2-2.2x低默认推荐,平衡选择
lz42-2.5x很低高吞吐场景
gzip2.5-3x高带宽敏感场景
zstd2.8-3.5x中Kafka 2.1+ 推荐

2.3 网络配置 ​

配置项默认值说明
max.block.ms60000send() 和 partitionsFor() 的最大阻塞时间
request.timeout.ms30000请求超时时间
metadata.max.age.ms300000元数据刷新间隔
connections.max.idle.ms540000连接空闲超时时间
send.buffer.bytes131072TCP 发送缓冲区大小
receive.buffer.bytes65536TCP 接收缓冲区大小

3. 可靠性配置 ​

3.1 确认机制 ​

配置项默认值可选值说明
acks10/1/allLeader 确认模式

acks 详解:

  • acks=0: 不等待确认,最高吞吐,可能丢数据
  • acks=1: 等待 Leader 确认,平衡方案
  • acks=all: 等待 ISR 中所有副本确认,最强一致性

3.2 重试配置 ​

配置项默认值说明
retries0发送失败重试次数
retry.backoff.ms100重试间隔
delivery.timeout.ms120000投递总超时时间
max.in.flight.requests.per.connection5单连接并发请求数

幂等性配置:

properties
enable.idempotence=true
max.in.flight.requests.per.connection=5
retries=Integer.MAX_VALUE
acks=all

启用幂等性后,即使重试也不会导致消息重复。

3.3 事务配置 ​

配置项默认值说明
transactional.idnull事务标识符
transaction.timeout.ms60000事务超时时间

4. 安全配置 ​

4.1 SSL 配置 ​

配置项说明
security.protocol安全协议: PLAINTEXT, SSL, SASL_PLAINTEXT, SASL_SSL
ssl.truststore.location信任库路径
ssl.truststore.password信任库密码
ssl.keystore.location密钥库路径
ssl.keystore.password密钥库密码

4.2 SASL 配置 ​

配置项说明
sasl.mechanismSASL 机制: GSSAPI, PLAIN, SCRAM-SHA-256 等
sasl.jaas.configJAAS 配置

5. 配置示例 ​

5.1 高吞吐场景 ​

java
Properties props = new Properties();
props.put("bootstrap.servers", "kafka1:9092,kafka2:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

// 批量优化
props.put("batch.size", 32768);        // 32KB
props.put("linger.ms", 20);            // 等待 20ms
props.put("buffer.memory", 67108864);  // 64MB

// 压缩
props.put("compression.type", "lz4");

// 异步确认
props.put("acks", "1");

Producer<String, String> producer = new KafkaProducer<>(props);

5.2 低延迟场景 ​

java
Properties props = new Properties();
props.put("bootstrap.servers", "kafka1:9092,kafka2:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

// 立即发送
props.put("linger.ms", 0);
props.put("batch.size", 1);

// 快速失败
props.put("retries", 0);
props.put("acks", "0");

Producer<String, String> producer = new KafkaProducer<>(props);

5.3 高可靠场景 ​

java
Properties props = new Properties();
props.put("bootstrap.servers", "kafka1:9092,kafka2:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

// 最强可靠性
props.put("enable.idempotence", "true");
props.put("acks", "all");
props.put("retries", Integer.MAX_VALUE);
props.put("delivery.timeout.ms", 120000);

// 降低并发避免乱序
props.put("max.in.flight.requests.per.connection", 5);

Producer<String, String> producer = new KafkaProducer<>(props);

5.4 事务场景 ​

java
Properties props = new Properties();
props.put("bootstrap.servers", "kafka1:9092,kafka2:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

// 事务配置
props.put("transactional.id", "my-producer-id");
props.put("enable.idempotence", "true");
props.put("acks", "all");

Producer<String, String> producer = new KafkaProducer<>(props);

// 初始化事务
producer.initTransactions();

try {
    producer.beginTransaction();
    producer.send(new ProducerRecord<>("topic", "key", "value"));
    producer.commitTransaction();
} catch (Exception e) {
    producer.abortTransaction();
}

配置参考: Apache Kafka Documentation