概述
最近更新时间: 2025-01-15 17:01:00
Consumer Group 状态说明
消费者组列表页中 Consumer Group 的状态主要有 Dead、Empty、PreparingRebalance、AwaitingSync、Stable 几种,其中最常见的是 Empty、Stable 和 Dead 三种状态。Consumer Group 中的状态机转换如下图所示:
- Dead:消费者组内无成员并且 Metadata 已经被移除。
- Empty:消费分组内当前没有任何成员。如果组内所有 offset 都已过期,则会变为 Dead 状态。一般新创建的 Group 默认为 Empty 状态。 开源 Kafka 0.10.x 版本规定,当消费分组内没有任何成员且状态持续超过7天,此消费分组将会被自动删除。
- Stable:消费分组中各个消费者已经加入,处于稳定状态。
Rebalance 状态详解
Rebalance 发生原因
根据 Consumer Group 的状态机可知,当 Consumer Group 为 Empty、AwaitSync 或 Stable 状态时,Group 可能会进行 Rebalance。以下情况可能会发生 Rebalance:
- 一个消费者订阅了 Topic。
- 消费者被关闭。
- 某个 Consumer 被 Group Coordinator(协调器)认为是 Dead 状态时。
如果某个Consumer 在
session.timeout.ms
时间内没有给 Group Coordinator 发心跳,则该 Consumer 将被认为是 Dead 状态,并且发起 Rebalance。详请参见 [CKafka 常用参数配置指南] 。 - 分区数增加。
- 订阅了不存在的 Topic。 如果您订阅了一个还未创建的 Topic,那么当这个 Topic 创建后会发生 Rebalance;同理,如果一个已经被订阅的 Topic 被删除,也会发生 Rebalance。
- 应用崩溃。
Rebalance 过程分析
以0.10版本Kafka 的机制为例,Rebalance 过程分析如下:
- 任何一个 Consumer 想要加入到一个 Consumer Group 中时,会发送一个 JoinGroup 的请求给 Group Coordinator。第一个加入 Group 的 Consumer 会变成 Group Leader。
- Leader 会从 Group Coordinator 处收到这个 Group 中所有 Consumer 列表,并且负责给 Group 中的 Consumer 分配 partition。分区的分配可以通过 PartitionAssignor 接口来实现。
- 分配完成后,Leader 会把分配结果发给 Group Coordinator,Coordinator 会把结果发送给所有的 Consumer。 因此每个 Consumer 只能查看到自己被分配的 partition,Leader 是唯一能够拿到Consumer Group 中的 Consumer 以及其分区情况的节点的 Consumer。
上述过程会在每次 Rebalance 发生时执行一次。