概述
最近更新时间: 2024-10-17 17:10: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 发生时执行一次。