首页/数据/数据工程与 ETL 速查/消费组 Consumer Group
Kafka64 条

消费组 Consumer Group

消费组是一组协同消费一个主题的消费者:组内按分区均分,一个分区同时只归一个成员;不同组各读全量互不影响,这也是多下游共享一个主题的方式。

消费组是什么

消费组(Consumer Group)是一组协同消费同一主题的消费者实例:组内按分区均分负载,一个分区在任意时刻只由一个成员消费。不同的组名各自维护独立的位移,因此同一份数据可以被多个下游各读一遍,这正是 Kafka 替代传统消息队列多播能力的机制。

再均衡的代价

成员增减、订阅变化或成员长时间未心跳,都会触发再均衡:分区在成员之间重新分配。再均衡期间消费停顿,位移可能回退,重复消费随之增加。控制单个批次处理时间、避免频繁重启实例,是减少再均衡影响的直接手段。

基本信息

分配单位分区:组内一个分区同一时刻只归一个成员
并行上限成员数超过分区数后,多余成员不分到任何分区
多组消费不同 group.id 各自维护位移,互不影响
关键参数group.id、session.timeout.ms、max.poll.interval.ms
位移存储提交到内部主题 __consumer_offsets

组状态读法

状态含义是否正常
Stable成员稳定,分区分配完成正常
PreparingRebalance有新成员加入或成员失效,正在准备再均衡短暂出现正常,长期停留异常
CompletingRebalance正在下发分配方案瞬时状态
Empty组存在但没有成员消费已停止,需确认是否为预期
Dead组已被清理,位移不再保留消费被彻底中断的信号

典型使用场景

  • 横向扩容消费能力:增加实例,分区自动在成员间重新分配
  • 多个下游共享一份数据:不同业务用不同 group.id 各读一份
  • 灰度验证:新组从同一起点消费,对比新旧逻辑输出是否一致
  • 排查消费停滞:确认组是否处于 Empty 或长期再均衡状态
  • 确认并行度是否用满:核对成员数与分区数是否匹配

消费组查看

消费组查看
# 列出集群中所有消费组
kafka-consumer-groups.sh --bootstrap-server localhost:9092 --list

# 查看某组的位移、积压与成员分配
kafka-consumer-groups.sh --bootstrap-server localhost:9092 \
  --describe --group order-consumer

# 只看组状态,快速判断是否在再均衡
kafka-consumer-groups.sh --bootstrap-server localhost:9092 \
  --describe --group order-consumer --state
同一个分区被两个客户端同时消费时,第一反应是核对 group.id:绝大多数情况是两个程序用了不同的组名,而不是分配出了错。
max.poll.interval.ms 决定两次 poll 之间的最大允许间隔。单批处理耗时超过它会被判定为成员失效并踢出组,造成「处理一半被重分配、位移不推进」的循环。

易错点

  • 消费者实例少于分区数,部分分区无人消费,表现为 lag 持续增长而实例并不繁忙
  • 不同环境或不同任务用了同一个 group.id,两边互相抢分区,位移交替推进,数据各自缺一半
  • 单批处理耗时超过 max.poll.interval.ms,成员被踢出组并反复再均衡,lag 锯齿式波动
  • 误以为增加消费者一定能提升消费能力:分区数不足时新增实例只会在那里空转

数据来源与参考

  • Apache Kafka 官方文档:Consumer Groups
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌