【Kafka从入门到成神系列 六】Kafka 消费组及重平衡

本文探讨了Kafka消费者组的工作原理,重点介绍了消费者组如何通过重平衡机制实现消息队列和发布/订阅模型的融合。重平衡的挑战包括暂停消费、分区再分配和性能损失。此外,讲解了不同分配策略以及重平衡的局限性。
  • 👏作者简介:大家好,我是爱敲代码的小黄,独角兽企业的Java开发工程师,Java领域新星创作者。
  • 📝个人公众号:爱敲代码的小黄(回复 “技术书籍” 可获千本电子书籍)
  • 📕系列专栏:Java设计模式、数据结构和算法、Kafka从入门到成神
  • 📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
  • 🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
  • 🍂博主正在努力完成2022计划中:以梦为马,扬帆起航,2022追梦人

一、消费者组

1. 简述

消费者组,既 Consumer Group。Consumer Group 是 Kafka 提供的可扩展且具有容错性的消费者机制。

一个消费者组有多个消费者,他们共享一个公共的 ID,这个 ID 被称为 Group ID组内的所有消费者协调在一起来消费订阅主题下的所有分区。

我们之前讲过 点对点模型和发布/订阅模型点对点模型的缺点在于,当我我们消费完一批数据之后,消息队列会将该笔数据进行删除,这种模型的 伸缩性 很差。而反观我们的发布/订阅模型,虽然数据允许多个消费者消费,但是他的伸缩性也不高,因为每个订阅者都要订阅主题的所有分区

我们有没有一种方法可以同时兼容这两种情况的?

那就是我们的消费者组,当我们的 Consumer Group 订阅了多个主题后,组内的每个实例只会消费一部分分区的消息。消费者组之间彼此独立,互不影响,能够订阅相同的一组主题而互不干涉。

Kafka 通过使用消费者组这一机制,实现了传统消息引擎的两大模型

如果所有实例都属于同一个 Group,那么它实现的就是消息队列模型;如果所有实例分别属于不同的 Group,那么它实现的就是发布 / 订阅模型。

理想情况下,Consumer 实例的数量应该等于该 Group 订阅主题的分区总数,相当于一个消费者实例对应一个分区。

  • Consumer 实例的数量 等于 该 Group 订阅主题的分区总数

image-20220314234947841

  • Consumer 实例的数量 小于 该 Group 订阅主题的分区总数

    image-20220314235126545

  • Consumer 实例的数量 大于 该 Group 订阅主题的分区总数

    image-20220314235309368

针对我们的消费者组,我们的 offset 是怎么进行管理的呢?

对于我们的消费组而言,使用 KV 对来进行表示,Key 是分区,Value 对应该分区的位移。使用我们的 Java 大概是这种:Map<TopicPartition, Long>

这里简单提一个概念,Kafka 之间的版本将 offset 放在我们的 Zookeeper 中,但后来发现,Zookeeper 这种框架不适合大量的写更新,会拖慢我们 Zookeeper 的性能,最终 Kafka 社区将 offset 放入到我们 Kafka 内部主题。也就是 _consumer_offset

2. 重平衡

2.1 简介

重平衡(Rebalance)本质上是一种协议,规定了一个 Consumer Group 下的所有 Consumer 如何达成一致,来分配订阅 Topic 的每个分区。

简单来说,比如我们某个 Group 有 20 个Consumer 实例,订阅了一个 100 分区的 Topic。正常情况下,Kafka 会为每个 Consumer 分配 5 个分区,这就叫 重平衡

重平衡触发的条件:

  • 组成员发生变更:Consumer 实例加入或离开消费组
  • 订阅主题数发生变更:新增符合条件的主题
  • 订阅主题分区数发生变更:新增一个主题的分区数

当重平衡发生时,消费组的所有 Consumer 都会协调在一起共同参与。

Kafka 提供 3 种分配策略,每一种都有优势和劣势,每一种具体的策略以后再进行解读,我们目前记住,社区提供保证最公平的策略,不会出现:**有的实例会“闲死”,而有的实例则会“忙死” **这种情况的发生。

image-20220315001735739

2.2 重平衡的缺点
  • 重平衡对消费组的消费有重大的影响。在重平衡期间,所有 Consumer 都会停止消费,等待重平衡的完成。
  • 重平衡让所有的分区重新分配,比如我 A 本来消费分区1、2、3,如果重平衡后还继续消费分区1、2、3就会节省大量的时间。如果我们重新换分区的话,还需要重新连接 Broker,重新创建 TCP 连接,无法达到 TCP 连接复用的状态。
  • 重平衡的速度及其缓慢。
评论 36
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱敲代码的小黄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值