一、引言
在 Spring Boot 项目中集成 Kafka 时,配置文件往往是开发者的第一道坎。application.yml 中密密麻麻的参数,每个都似懂非懂------抄过来能用,但出了问题完全不知道从哪里排查。
本文不打算泛泛而谈"如何集成 Kafka",而是逐行解析一份可直接用于生产环境的 Spring Boot Kafka 配置。我会把每个参数掰开揉碎讲清楚:它是干什么的?为什么这么配?不这么配会怎样?配错了有什么后果?
无论你是刚接触 Kafka 的新手,还是正在为线上频繁 Rebalance 焦头烂额的开发者,相信这篇文章都能给你带来实实在在的帮助。
说明:本文配置基于 Spring Boot 2.7.x / 3.x,Kafka 客户端版本 3.0+。配置格式为 YAML。
二、配置全景概览
在深入每一行之前,先看一眼整体结构。一份完整的 Spring Boot Kafka 配置通常包含以下七大块:

三、完整配置
java
spring:
# ==================== Kafka 消息队列配置 ====================
kafka:
# ---------- 基础连接配置 ----------
# Kafka 服务端地址(支持集群,用英文逗号分隔)
# 生产环境建议至少配置 3 个 Broker 地址,防止单点故障
bootstrap-servers: ip:9092
# 客户端 ID(用于标识请求来源,便于服务端日志追踪和监控)
client-id: ${spring.application.name:default-app}
# ---------- 生产者配置(Producer) ----------
producer:
# --- 序列化配置 ---
# Key 序列化方式(字符串类型,使用 StringSerializer)
key-serializer: org.apache.kafka.common.serialization.StringSerializer
# Value 序列化方式(若传输复杂对象可改为 JsonSerializer)
value-serializer: org.apache.kafka.common.serialization.StringSerializer
# --- 可靠性核心配置 ---
# acks 确认机制:
# 0:不等待确认(最高性能,消息可能丢失)
# 1:仅 Leader 确认(默认,兼顾可靠性与性能)
# all 或 -1:等待所有 ISR 副本确认(最强可靠性,消息不丢失)
acks: all
# 发送失败时的重试次数(建议设置较大值,配合幂等使用)
retries: 10
# 重试间隔退避时间(毫秒),避免频繁重试压垮 Broker
# 注:此参数为 Kafka 原生属性,Spring Boot 2.7+ 在 properties 中配置
# --- 吞吐量与延迟调优 ---
# 批量发送缓冲区大小(字节),默认 16KB。调大可提高吞吐量,但会增加延迟
batch-size: 32768
# 消息延迟发送时间(毫秒)。适当增加(如 5-10ms)可聚合更多消息批量发送
linger-ms: 5
# 生产者总缓存大小(字节)。需大于 batch-size,且至少能容纳一次重试
buffer-memory: 67108864 # 64MB
# 压缩类型:snappy(平衡 CPU 和压缩比)/ lz4(性能更好)/ zstd(压缩比最高)
compression-type: snappy
# --- 扩展属性(Spring Boot 未直接映射的 Kafka 原生精细配置) ---
properties:
# === 幂等性与顺序性 ===
# 启用幂等生产者(保证 Exactly-Once 语义,必须配合 acks=all)
# 开启后,Broker 会自动去重,防止网络重试导致的消息重复
enable.idempotence: true
# 单连接最大未确认请求数(即最大并发 In-Flight 请求数)
# 开启幂等后,Kafka 2.0+ 允许设置为 1-5(设置为 5 可兼顾顺序与吞吐量)
# 若未开启幂等,必须设置为 1 才能保证分区内消息顺序
max.in.flight.requests.per.connection: 5
# === 超时与重试控制 ===
# 单次请求超时时间(毫秒),超过后视为失败进入重试逻辑
request.timeout.ms: 30000
# 端到端总投递超时时间(毫秒),包含重试间隔和回退时间
# 应大于 (retries + 1) * (request.timeout.ms + retry.backoff.ms)
delivery.timeout.ms: 120000
# 重试间隔退避基础时间(毫秒)
retry.backoff.ms: 100
# 网络连接超时时间(毫秒)
connect.timeout.ms: 10000
# === 元数据与连接管理 ===
# 生产者强制刷新元数据的时间间隔(毫秒),若连接 Broker 变化可更快感知
metadata.max.age.ms: 300000
# === 事务支持(如需事务性消息,取消下方注释) ===
# 事务ID前缀(启用后自动开启事务并创建 KafkaTransactionManager)
# 注意:不同应用实例/消费者组必须使用不同的前缀,否则事务会混乱
# transaction.id.prefix: tx-${spring.application.name}-
# 事务超时时间(毫秒),必须小于 Broker 端的 transaction.max.timeout.ms(默 15 分钟)
# transaction.timeout.ms: 60000
# ---------- 消费者配置(Consumer) ----------
consumer:
# --- 反序列化配置 ---
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
# --- 消费组与位点配置 ---
# 消费者组 ID(同一组内消费者分摊分区,实现负载均衡)
group-id: ${spring.application.name:template-group}
# 无初始偏移量或当前偏移量失效时的消费策略:
# earliest:从头开始消费(可能导致大量历史消息重放,请确认业务是否可接受)
# latest:从最新开始消费(默认,只消费新消息,可能丢失启动前的数据)
auto-offset-reset: earliest
# --- 提交偏移量策略(可靠性核心) ---
# 【生产环境强烈建议】关闭自动提交(设为 false),转为手动提交(MANUAL 模式)
# 原因:自动提交可能导致"业务处理失败但偏移量已提交"的消息丢失问题
enable-auto-commit: false
# 若开启自动提交,此处为提交间隔(毫秒),开启手动模式后此参数失效
auto-commit-interval: 1000
# --- 拉取性能调优 ---
# 单次 poll() 最大拉取消息条数。根据消息体大小调整,过大可能因序列化占用过多内存
max-poll-records: 200
# 单次拉取最小字节数。Broker 攒够此大小才响应,调大可提高吞吐量但会增加延迟
fetch.min.bytes: 10240
# 单次拉取最大等待时间(毫秒)。若数据未达到 fetch.min.bytes,最多等待此时间
fetch.max.wait.ms: 5000
# 单个分区最大拉取字节数(默认 1MB),若消息超大需要调大此值及 Broker 端配置
max.partition.fetch.bytes: 1048576
# 拉取请求最大字节数(默认 50MB),一般无需调整
fetch.max.bytes: 52428800
# --- 扩展属性(消费者精细控制) ---
properties:
# === 会话与心跳(影响 Rebalance 稳定性) ===
# 会话超时时间(毫秒)。若 Broker 在此时间内未收到心跳,判定消费者死亡触发 Rebalance
session.timeout.ms: 45000
# 心跳发送间隔(毫秒)。建议为 session.timeout 的 1/3 左右(此处 15s 发一次)
heartbeat.interval.ms: 15000
# 单次 poll 处理最大间隔(毫秒)。若两次 poll 间隔超过此值,即使心跳正常也会被踢出组
# 适用于处理耗时较长的业务,需根据实际业务逻辑合理设置
max.poll.interval.ms: 600000 # 10 分钟
# === 反序列化与数据校验 ===
# 是否检查 CRC 校验和。开启可防止消息损坏,但有轻微性能开销
check.crcs: true
# 排除内部主题(如 __consumer_offsets),避免业务消费到系统消息
exclude.internal.topics: true
# === 事务隔离级别(配合生产者事务使用) ===
# read_uncommitted:可读取未提交消息(默认,性能好)
# read_committed:仅读取已提交消息(保证不会读到事务回滚的脏数据)
isolation.level: read_committed
# ---------- 监听器容器配置(Listener Container) ----------
listener:
# --- 提交偏移量模式(配合 enable-auto-commit: false 使用) ---
# RECORD:每处理一条消息立即提交
# BATCH:每批(poll 一次)消息统一提交(默认)
# MANUAL:手动调用 Acknowledgment.acknowledge() 提交
# MANUAL_IMMEDIATE:手动调用立即提交(不等待下一轮 poll)
# 【推荐】使用 MANUAL 或 MANUAL_IMMEDIATE,由业务代码控制提交时机
ack-mode: manual_immediate
# --- 并发与线程模型 ---
# 并发消费者线程数(即开启的消费者实例数)。
# 注意:建议 <= 主题分区总数,否则多余线程会空闲
# 若分区数为 6,设置 concurrency=3,每个线程负责 2 个分区
concurrency: 3
# --- 启动与容错 ---
# 启动时是否自动创建监听容器(默认 true,极少改动)
# auto-startup: true
# 若指定的 Topic 不存在,是否抛出致命异常(启动失败)
# 生产环境建议 false,结合动态 Topic 创建或 AdminClient 自动创建
missing-topics-fatal: false
# --- 监听器超时与轮询 ---
# 监听器容器空闲事件发送间隔(毫秒),用于监控空闲消费者
idle-event-interval: 60000
# 每一次 poll 操作的超时时间(毫秒),若拉取超时会触发后续重试逻辑
poll-timeout: 3000
# ---------- Kafka Admin 客户端配置(自动管理主题) ----------
admin:
# 是否自动创建主题。开启后,KafkaAdmin 会根据程序中的 NewTopic Bean 自动创建
auto-create: true
# Admin 客户端连接超时(毫秒)
properties:
bootstrap.servers: 8.137.192.133:9092
connect.timeout.ms: 10000
# ==================== SSL / SASL 安全认证配置(生产环境必配) ====================
# 以下为安全连接配置模板(根据实际认证方式取消注释并填写)
# 注意:同时配置 SSL 和 SASL 时,代表 SASL_SSL 协议
# ssl:
# # 启用 SSL 加密传输
# enabled: true
# # 信任库位置(JKS 格式)
# trust-store-location: /path/to/kafka.truststore.jks
# # 信任库密码
# trust-store-password: ${KAFKA_TRUSTSTORE_PASSWORD}
# # 密钥库位置(如果需双向认证)
# key-store-location: /path/to/kafka.keystore.jks
# # 密钥库密码
# key-store-password: ${KAFKA_KEYSTORE_PASSWORD}
# # 密钥密码(通常与 key-store-password 相同)
# key-password: ${KAFKA_KEY_PASSWORD}
#
# security:
# protocol: SASL_SSL # 可选:PLAINTEXT, SSL, SASL_PLAINTEXT, SASL_SSL
#
# properties:
# # SASL 认证机制(如 PLAIN, SCRAM-SHA-256, SCRAM-SHA-512, GSSAPI)
# sasl.mechanism: PLAIN
# # SASL JAAS 配置(用户名密码)
# sasl.jaas.config: org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin-secret";
# ==================== 业务自定义 Topic 映射 ====================
# 此处为业务层约定的 Topic 名称(非 Kafka 配置,用于代码中引用常量)
topics:
# 测试调试专用
test: test-topic
# 模板业务
template: template-topic