SpringBoot Kafka消费者组双实例仅单实例消费问题排查
以下是针对该问题的具体排查方向,核心差异出在第一台Kafka集群或消费配置上:
Topic分区数量不匹配:Kafka的核心规则是同一消费者组内,一个分区只能被一个消费者实例消费。如果第一台Kafka上的目标Topic只有1个分区,哪怕启动两个实例,也只会有一个实例分到这个唯一分区,另一个实例无分区可消费。你可以用Kafka命令行工具查看分区数:
kafka-topics.sh --describe --topic <目标Topic名> --bootstrap-server <Kafka地址:端口>对比另一台Kafka的Topic分区数,大概率存在差异。
分区分配策略配置差异:检查两个环境的SpringBoot消费配置,第一台可能使用了
RangeAssignor分配策略,当分区数和实例数分配不均时(比如3分区2实例),会出现实例分配的分区数差异,极端情况(1分区)会导致单实例独占。而另一台可能配置了RoundRobinAssignor这类更均衡的策略,或者分区数刚好和实例数匹配。查看配置项spring.kafka.consumer.partition-assignment-strategy。Kafka组协调器异常:消费者组的分区分配由Kafka的GroupCoordinator负责,如果第一台Kafka的协调器所在Broker节点存在网络波动、日志异常或节点负载过高,可能导致第二个实例无法正常加入组,分区分配只完成了第一个实例的注册。可以查看Kafka Broker日志,搜索
GroupCoordinator相关的错误或警告信息。消息生产的分区倾斜:如果第一台Kafka的Producer发送消息时指定了固定的
key,所有消息会被路由到同一个分区,哪怕Topic有多个分区,也只会有一个实例能消费到消息。而你手动发送时未指定key,消息随机分配到不同分区,所以另一台环境能正常分配消费。检查第一台的Producer发送逻辑,是否存在固定key的情况。消费者组ID配置不一致:务必确认第一台的两个SpringBoot实例的
spring.kafka.consumer.group-id配置完全一致,是否存在环境变量覆盖、配置文件差异导致组ID不同的情况——如果组ID不同,两个实例属于不同消费者组,自然不会共享分区,出现单实例消费的现象。
内容的提问来源于stack exchange,提问作者mloves

