Kafka消费者组原理剖析
消费者组(Consumer Group)是什么
Consumer Group 是kafka提供的可扩展且具有容错性的消费者机制,消费者组内有多个消费者,它们被同一个ID所标识,这个ID被称为Group ID,组内所有的消费者通过协调机制一起消费订阅主题的分区,每个分区只能由一个消费者实例去消费。
消费者组解决了什么问题
我们知道消息中间件通常有两种引擎模型,点对点模型和发布/订阅模型。 点对点模型的消息一旦被消费就会从队列中删除,而且消息只能被一个消费者消费,这种模型典型的缺点是伸缩性比较差。而发布/订阅模型要求每个消费者订阅主题的所有分区,这种做法伸缩性也不好。Kafka消费者组很好的解决了上述两种模型伸缩性差的问题。如果kafka所有消费者实例都属于同一个Group那么它实现的就是点对点模型,如果所有消费者实例分别属于不同的Group那么它实现的就是发布/订阅模型。在消费者组中,理想状态下,消费者实例的数量应当与消费者组订阅主题的分区总数。假设一个 Consumer Group 订阅了 3 个主题,分别是 A、B、C,它们的分区数依次是 1、2、3,那么通常情况下,为该 Group 设置 6 个 Consumer 实例是比较理想的情形,因为它能最大限度地实现高伸缩性。如果你设置了 8 个实例,那么很遗憾,有 2 个实例(8 – 6 = 2)将不会被分配任何分区,它们永远处于空闲状态。因此,在实际使用过程中一般不推荐设置大于总分区数的 Consumer 实例。设置多余的实例只会浪费资源,而没有任何好处。
消费者组Rebalance
Rebalance 本质上是一种协议,规定了一个 Consumer Group 下的所有 Consumer 如何达成一致,来分配订阅 Topic 的每个分区。比如某个 Group 下有 20 个 Consumer 实例,它订阅了一个具有 100 个分区的 Topic。正常情况下,Kafka 平均会为每个 Consumer 分配 5 个分区。这个分配的过程就叫 Rebalance。
消费者组出发Rebalance主要有以下三个条件:
- 消费者组内消费者实例发生变化
- 消费者组订阅的主题数量发生变更
- 订阅主题的分区数发生变更
Rebalance 发生时,Group 下所有的 Consumer 实例都会协调在一起共同参与。你可能会问,每个 Consumer 实例怎么知道应该消费订阅主题的哪些分区呢?这就需要分配策略的协助了。
当前 Kafka 默认提供了 3 种分配策略,每种策略都有一定的优势和劣势,我们今天就不展开讨论了,你只需要记住社区会不断地完善这些策略,保证提供最公平的分配策略,即每个 Consumer 实例都能够得到较为平均的分区数。比如一个 Group 内有 10 个 Consumer 实例,要消费 100 个分区,理想的分配策略自然是每个实例平均得到 10 个分区。这就叫公平的分配策略。如果出现了严重的分配倾斜,势必会出现这种情况:有的实例会“闲死”,而有的实例则会“忙死”。
Rebalance会导致消费者组内的所有消费者实例都停止消费,知道Rebalance过程结束,因此应该尽量避免出现这种情况。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码