本文主要讲解Spring kafka常见的参数,以及介绍Spring kafka实践过程中的经验总结。
参数说明
spring.kafka.bootstrap-servers:Kafka broker 集群地址,用于建立初始连接。
spring.kafka.producer.retries:消息发送失败后的重试次数。
spring.kafka.producer.acks:消息发送确认机制:
-
acks=0: 不等待确认,适合日志类等可接受少量数据丢失的情况。
-
acks=1: 确认 leader 副本写入(kafka默认机制)。
-
acks=all/-1: 确认所有ISR副本写入,适合可靠性要求高的业务,缺点是会降低吞吐量。
spring.kafka.producer.batch-size:消息批量发送阈值大小,通常取值 16KB-128KB。
spring.kafka.producer.buffer-memory:生产者缓冲区总内存,高吞吐场景设置 64MB-128MB。
spring.kafka.producer.key-serializer:生产者消息键序列化方式:
- JSON消息:
org.springframework.kafka.support.serializer.JsonSerializer - 二进制数据:
org.apache.kafka.common.serialization.ByteArraySerializer
spring.kafka.producer.value-serializer:生产者消息值序列化方式:
- JSON消息:
org.springframework.kafka.support.serializer.JsonSerializer - 二进制数据:
org.apache.kafka.common.serialization.ByteArraySerializer
spring.kafka.producer.properties.linger.ms:批量发送等待时间:
高吞吐场景,设置100-500ms;低延迟场景,设置为0或5-20ms
spring.kafka.producer.delivery-timeout:消息发送最大超时时间。
spring.kafka.consumer.auto-offset-reset:无偏移量时的重置策略:
-
latest: 从最新消息开始,适合非新应用的实时处理。
-
earliest: 从最早消息开始,适合新应用上线场景。
spring.kafka.consumer.max-poll-records:消费者单次 poll 最大消息数:
轻量处理:设置 500-1000;重量处理:设置 10-100。
spring.kafka.consumer.enable-auto-commit:是否自动提交偏移量。
对可靠性要求高,设置为 false,否则设置为 true。
spring.kafka.consumer.group-id:消费者组id。
按业务功能命名,不同环境加后缀,如 mos-biz-prod。
spring.kafka.consumer.key-serializer:消费者消息键序列化方式
- JSON消息:
org.springframework.kafka.support.serializer.JsonSerializer - 二进制数据:
org.apache.kafka.common.serialization.ByteArraySerializer
spring.kafka.consumer.value-serializer:消费者消息值序列化方式
- JSON消息:
org.springframework.kafka.support.serializer.JsonSerializer - 二进制数据:
org.apache.kafka.common.serialization.ByteArraySerializer
spring.kafka.consumer.properties.max.poll.interval.ms:消费者两次poll最大间隔时间。
spring.kafka.consumer.heartbeat-interval:消费者发送心跳到协调器的时间间隔。
spring.kafka.consumer.session-timeout:消费者与broker会话超时时间,默认值10000ms。
spring.kafka.consumer.max-poll-interval:消费者两次poll最大间隔。
spring.kafka.consumer.listener.missing-topics-fatal:主题不存在时是否使应用启动失败。
建议非生产环境设置成 false,生产环境设置为 true。
spring.kafka.consumer.listener.ack-mode:手动提交时的确认模式
-
RECORD: 逐条提交
-
BATCH: 批处理提交(默认)
-
MANUAL: 手动调用 Acknowledgment.acknowledge()
-
MANUAL_IMMEDIATE: 立即提交
-
TIME: 定时提交
spring.kafka.consumer.listener.type:监听器类型。
single: 单消息处理(默认)、batch: 批量处理。
spring.kafka.consumer.listener.concurrency:并发消费者线程数
实践总结
1、batch-size 和 properties.linger.ms 参数设置说明。
高吞吐量,可接受一定延迟
-
设置较大的
batch-size(如512KB)和较大的linger.ms(如100-500ms) -
生产者会积累更多的消息,从而减少网络请求次数,提高吞吐量
-
适用于日志收集、大数据处理等场景。
低延迟,可接受一定吞吐量损失
-
设置较小的
batch-size(如16KB)和较小的linger.ms(如0-20ms) -
消息会更快发送,但网络请求次数增加,吞吐量可能下降。
-
适用于实时性要求高的场景,如实时监控等。
2、max-poll-records 和 properties.max.poll.interval.ms 参数设置说明。
max-poll-records 设置为一个合理的批量大小,避免一次拉取过多消息导致处理时间超过properties.max.poll.interval.ms 设置值,一旦超过将会触发消息重平衡机制。
3、session-timeout 和 heartbeat-interval 参数设置说明。
为什么 session-timeout > 3 × heartbeat-interval?被广泛采纳的最佳实践,源自 Kafka 官方推荐和实际运维经验。
4、spring.kafka.consumer.listener.concurrency 参数设置说明。
并发消费者线程数取值,建议不超过 Topic 分区数,多余线程即使设置,也只是在空转。
5、spring.kafka.consumer.listener.ack-mode 参数设置说明。
如果 ack-mode 设置为 manual_immediate,需要在监听器方法中注入 Acknowledgment 参数,并在处理完成后显示调用 acknowledge()方法。如果没有调用 acknowledge(),偏移量不会更新,消息会重复消费,长时间不提交,超过 properties.max.poll.interval.ms 值,会触发消息重平衡机制。
6、spring.kafka.producer.delivery-timeout 参数设置说明。
建议 delivery-timeout >= linger.ms + request.timeout.ms × (retries + 1)
示例计算:linger.ms = 100ms、request.timeout.ms = 30000ms (30秒)、retries = 3
最小 delivery-timeout = 100 + 30000 × (3+1) = 120100ms ≈ 120秒
7、注意生产者和消费者的键值序列化和反序列化方式必须匹配,否则会出现消费错误。
8、spring.kafka.consumer.max-poll-interval 和 properties.max.poll.interval.ms 参数说明。
两者效果是一样的,同时配置 max.poll.interval.ms 优先级更高