Kafka 消费者组是什么?rebalance 如何发生、有何影响?

结论先行:消费者组是 Kafka 实现"一条消息只被组内一个消费者处理、多个消费者并行分摊分区"的机制:一个分区同一时刻只分配给组内一个消费者,组内消费者数量超过分区数时多余消费者会空闲。rebalance 是分区在组内消费者之间重新分配的过程,会造成消费短暂停顿与重复消费,属于面试高频考点。

一、消费者组与位移

  • 组与分区:订阅同一主题的一组消费者共享全部分区,分区按规则分配给成员,新增成员或减少成员都会触发重新分配;
  • 位移提交:每个分区当前消费到的位置(offset)由消费者提交到内部主题 __consumer_offsets,重启后从提交的位移继续消费;
  • 提交时机:处理完再提交是至少一次(可能重复),先提交再处理是至多一次(可能丢),一般选前者并配合消费幂等;
  • 再均衡的代价:分区易主意味着处理状态要随位移提交交接,处理中的消息可能在新消费者侧重复;
  • 分区分配原则:组内消费者数量超过分区数时,多出的消费者空转,盲目扩容消费者不一定提升吞吐。

二、rebalance 的触发与过程

触发原因说明
成员加入/离开新消费者加入、消费者主动退出
消费者故障心跳超时、poll 间隔超时被判离线
订阅变化主题分区数变化、订阅的正则新增/删除主题
  • 过程:触发后组内消费者重新执行 JoinGroup(选组长并汇报订阅)→ 组长计算分配方案 → SyncGroup 把方案同步给所有成员;
  • 分配策略:range(按主题连续切分)、roundrobin(轮询)、sticky(尽量保持原分配)、cooperative-sticky(增量协作,避免全体停摆);
  • 影响:旧协议下全体成员先 revoke 再分配,消费全部暂停、位移提交混乱,可能造成大量重复消费与抖动;
  • 协调者:group coordinator 负责管理组成员与位移,组内所有成员的心跳都发往它,它也是位移提交的入口。

三、减少 rebalance 的常见手段

# 消费者端参数
session.timeout.ms=10000        # 心跳超时,调大可减少误判离线
heartbeat.interval.ms=3000      # 心跳间隔
max.poll.interval.ms=300000     # 单次 poll 处理的最长间隔,防止处理慢被踢
enable.auto.commit=false        # 关闭自动提交,业务成功后再手动提交位移
  • 进阶手段:配置静态成员 group.instance.id 后,实例重启不会触发 rebalance;新版客户端心跳线程与 poll 分离,处理慢也不再连坐踢出。

常见追问 / 记忆点

  • 追问:处理一条消息很慢会触发 rebalance 吗?答:会,超过 max.poll.interval.ms 未 poll 会被判定失活,调大参数或异步处理可缓解。
  • 追问:rebalance 期间消息会丢吗?答:不会丢,但可能重复——分区交接时新消费者从已提交位移开始拉取,靠幂等兜底。
  • 追问:cooperative-sticky 好在哪?答:只撤销需要变更的分区,增量分配,避免全体停顿,是较新的推荐协议。
  • 记忆点:一区分属一消费者、位移提交决定重复还是丢失、心跳与 poll 超时是 rebalance 的主要导火索。
笔记加载中…