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 优先级更高

相关推荐
我真会写代码1 小时前
从入门到精通:Kafka核心原理与实战避坑指南
分布式·缓存·kafka
一叶飘零_sweeeet3 小时前
击穿 Kafka 高可用核心:分区副本、ISR 机制与底层原理全链路拆解
分布式·架构·kafka
indexsunny1 天前
互联网大厂Java面试实战:从Spring Boot到微服务架构的深度解析
java·spring boot·spring cloud·kafka·prometheus·security·microservices
睡醒的土豆1 天前
解决 Kafka 管理工具中文乱码问题
分布式·kafka
殷紫川1 天前
击穿 Kafka 高可用核心:分区副本、ISR 机制与底层原理全链路拆解
架构·kafka
岁岁种桃花儿1 天前
Flink从入门到上天系列第二十五篇:Flink和Kafka连接时的精准一次性
大数据·flink·kafka
七夜zippoe1 天前
消息队列选型:Kafka vs RabbitMQ vs Redis 深度对比
redis·python·kafka·消息队列·rabbitmq
LF3_1 天前
监听数据库binlog日志变化,将变动实时发送到kafka
数据库·分布式·mysql·kafka·binlog·debezium
攒了一袋星辰2 天前
SequenceGenerator高并发有序顺序号生成中间件 - 架构设计文档
java·后端·spring·中间件·架构·kafka·maven