🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 消费者组 * 消费者组,i.e. Consumer Group * Consumer Group 是 Kafka 提供的可扩展且具有容错性的消费者机制 * 一个组内有多个消费者实例(Consumer Instance) * 共享一个公共的 ID,i.e. Group ID * 组内所有 Consumer 协调一起消费订阅主题(Subscribed Topics)的所有分区(Partition) * 每个分区只能由一个 Consumer Group 内的一个 Consumer Instance 消费 Consumer Group 三特性 * Consumer Group 下可以有 1-N 个实例 * 实例可以是单独进程,也可以是同一进程下的线程 * Group ID 是一个字符串,它标识唯一的一个 Consumer Group * Consumer Group 下所有实例订阅的 Topic 的单个分区,只能分配给组内的某个 Instance 消费 消息引擎模型 * Consumer Group 订阅了多个 Topic 后,组内的每个 Instance 不要求一定要订阅 Topic 的所有 Partition,它只会消费部分分区中的消息 * Consumer Group 之间彼此独立不影响 * 能够订阅相同的一组 Topic 而不干涉 * Kafka 使用 Consumer Group 机制,同时实现了传统消息引擎系统的两大模型(P2P & Pub/Sub),i.e. * 所有实例属于同一个 Group,实现的是消息队列模型 * 所有实例分别属于不同的 Group,实现的是 Pub/Sub 模型 --- * 理想情况下,Consumer 实例的数量应该等于该 Group 订阅的 Topic 的分区总数 * 针对 Consumer Group,Kafka 怎么管理 offset? * 对于 Consumer Group,它是一组 KV 对,Key 是分区,V 是 Consumer 消费该分区的 offset * 老版本 Kafka 将 offset 存储于 ZooKeeper * ZK 不适合频繁读写 * 新版本将 offset 存储于 Broker 内部 Topic 中,i.e. __consumer_offset ## Rebalance * Rebalance 触发条件 3 个 * 组成员数变化,e.g. 新 Consumer Instance 加入,或被踢除 * 订阅 Topic 数发生变更 * 订阅 Topic 的 Partition 变更 * Kafka 只允许增加一个 Topic 的分区数。当分区数增加时,就会触发订阅该 Topic 的所有 Group 开启 Rebalance * 3 种分配策略 * 分配目的:保证最公平的分配策略 ![](https://img.kancloud.cn/29/76/2976713957cd4cc8cc796aa64222611b_1478x858.png) * Rebalance 的问题 * Rebalance 类似 JVM STW(stop the world) GC * 所有 Consumer Instance 都会停止消费,等待分配完成 * Rebalance 过于慢