Spring Kafka核心参数说明

本文主要讲解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 优先级更高

相关推荐
QQ_43766431410 小时前
kafka
分布式·kafka
掘金-我是哪吒11 小时前
完整的Kafka项目启动流程
分布式·kafka
IT大白1 天前
2、Kafka原理-Producer
分布式·kafka
jamesge20101 天前
kafka学习笔记
笔记·学习·kafka
IT大白1 天前
1、Kafka基础
kafka
sww_10261 天前
Kafka和RocketMQ存储模型对比
分布式·kafka·rocketmq
奔波霸的伶俐虫1 天前
spring boot集成kafka学习
spring boot·学习·kafka
bentengjiayou1 天前
Kafka和RabbitMQ相比有什么优势?
分布式·kafka·rabbitmq