Spring Kafka @KafkaListener在多集群(含AWS MSK)环境下采用手动立即确认+FixedBackOff模式时,间歇性停止消费消息问题求助
Spring Kafka @KafkaListener在多集群(含AWS MSK)环境下采用手动立即确认+FixedBackOff模式时,间歇性停止消费消息问题求助
各位大佬好,最近我们团队遇到了一个非常棘手的Spring Kafka间歇性停服消费问题,折腾好几天都没找到根因,想请有经验的朋友帮忙分析下!
环境背景
- 技术栈:Spring Boot + Spring Kafka
- 消费配置:@KafkaListener 使用
AckMode.MANUAL_IMMEDIATE手动立即确认模式,搭配FixedBackOff退避策略 - 集群架构:维护了两个
ConcurrentKafkaListenerContainerFactoryBean,分别对接On-prem自建Kafka集群和AWS MSK集群,每个消费者Listener都会显式指定对应的containerFactory - 主题分布:MSK集群关联5个主题,On-prem集群关联4个主题,分属不同的容器工厂
异常现象
应用正常运行一段时间后,会出现以下异常表现:
- 消费者突然停止处理消息,完全卡住
- 日志中反复出现重平衡失败的报错(DEBUG级别),核心日志片段如下:
Sending read_uncommitted IncrementalFetchRequest Adding pending request Removing pending request Request joining group due to: rebalance failed due to 'The group is rebalancing, so a rejoin is needed.' (RebalanceInProgressException) SyncGroup failed: The group began another rebalance. Need to re-join the group. Sent generation was Generation Joining group with current subscription: TOPIC_NAME SyncGroup failed: The group began another rebalance. Need to re-join the group.
- 关键健康指标无异常日志:
- 没有心跳失败的记录
- 没有
max.poll.interval.ms超时的告警 - 没有Kafka连接断开的日志
- 消息与分区状态:目标分区确实存在未消费消息,执行
kafka-consumer-groups --describe命令可见分区有消费滞后,部分分区甚至不显示对应的消费组ID - 重启应用后的表现:会强制触发重平衡,部分主题恢复消费,但并非所有主题都能正常恢复
已完成的排查验证
为定位问题,我们逐一排除了以下常见诱因:
- ✅ Listener逻辑中100%会调用
ack.acknowledge(),没有遗漏消息确认的情况 - ✅ 不存在毒丸消息(poison pill record)导致消费阻塞
- ✅ 没有无限重试循环或无限退避的逻辑
- ✅ 没有事务隔离级别相关的问题
- ✅ 未使用主题模式订阅,所有消费者均明确订阅具体主题名称
- ✅ 应用启动时所有主题已存在,且日志明确显示“Subscribed to the topic [TOPIC_NAME]”,启动阶段已完成全主题订阅
关键配置信息
我们的核心Kafka消费者配置如下(其余为Spring Kafka默认值):
enable-auto-commit: false # 配合手动立即确认模式 auto-offset-reset: earliest request.timeout.ms: 60000 connections.max.idle.ms: 300000 metadata.max.age.ms: 120000 max.poll.interval.ms: 900000
我们尝试过调整上述参数(比如调大/调小部分阈值),但问题依然存在。
目前我们实在摸不着头绪,有没有遇到过多集群环境下Spring Kafka反复重平衡、间歇性停服消费的朋友?求给点排查方向或者解决方案,万分感谢!




