消费组是什么
消费组(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 之间的最大允许间隔。单批处理耗时超过它会被判定为成员失效并踢出组,造成「处理一半被重分配、位移不推进」的循环。