当前位置: 首页 > news >正文

分布式 - 消息队列Kafka:Kafka消费者分区再均衡(Rebalance)

文章目录

      • 01. Kafka 消费者分区再均衡是什么?
      • 02. Kafka 消费者分区再均衡的触发条件?
      • 03. Kafka 消费者分区再均衡的过程?
      • 04. Kafka 如何判定消费者已经死亡?
      • 05. Kafka 如何避免消费者的分区再均衡?
      • 06. Kafka 消费者分区再均衡有什么影响?
      • 07. Kafka 消费者分区再均衡的两种机制?
      • 08. kafka 消费者分区再均衡协议
      • 09. kafka 消费者分区再均衡流程
      • 10. Kafka 消费者组固定成员是什么?
      • 11. Kafka 消费者分区再均衡的4种场景

01. Kafka 消费者分区再均衡是什么?

消费者群组里的消费者共享主题分区的所有权。当一个新消费者加入群组时,它将开始读取一部分原本由其他消费者读取的消息。当一个消费者被关闭或发生崩溃时,它将离开群组,原本由它读取的分区将由群组里的其他消费者读取。

分区的所有权从一个消费者转移到另一个消费者的行为称为再均衡。再均衡非常重要,它为消费者群组带来了高可用性和伸缩性(你可以放心地添加或移除消费者)。不过,在正常情况下,我们并不希望发生再均衡。

Rebalance 本质上是一组协议,它规定了一个消费者组是如何达成一致来分配订阅 主题的所有分区的。假设某个组下有20个消费者实例,该组订阅了一个有着100个分区的主题。正常情况下,Kafka会为每个消费者平均分配5个分区。这个分配过程就被称为 Rebalance。

Rebalance 就是说如果消费组里的消费者数量有变化或消费的分区数有变化,kafka 会重新分配消费者消费分区的关系。

02. Kafka 消费者分区再均衡的触发条件?

主题发生变化(比如管理员添加了新分区)会导致分区重分配。Kafka 消费者端的 Rebalance 操作会在以下情况下发生:

① 消费者组中新增或减少了消费者;

② 消费者所订阅的主题的分区数量发生变化;

③ 消费者订阅的主题个数发生变化;

后面两个通常都是运维的主动操作,所以它们引发的 Rebalance 大都是不可避免的。实际上大部分情况下,导致分区再均衡的原因都是消费者组成员数量发生变化。

03. Kafka 消费者分区再均衡的过程?

Rebalance 是通过消费者群组中的称为“群组首领”消费者客户端进行的。

① 选择群组首领:当一个消费者想要加入消费者群组时,它会向群组协调器发送 JoinGroup 请求。第一个加入群组的消费者将成为群组首领。

② 消费者通过向被指派为群组协调器(Coordinator)的 Broker 定期发送心跳来维持它们和群组的从属关系以及它们对分区的所有权。

③ 群组首领从群组协调器获取群组的成员列表(列表中包含了所有最近发送过心跳的消费者,它们被认为还“活着”),并负责为每一个消费者分配分区。它使用实现了PartitionAssignor接口的类来决定哪些分区应该被分配给哪个消费者。

④ 分区分配完毕之后,群组首领会把分区分配信息发送给群组协调器;

⑤ 群组协调器再把这些信息发送给所有的消费者。每个消费者只能看到自己的分配信息,只有群组首领会持有所有消费者及其分区所有权的信息。

04. Kafka 如何判定消费者已经死亡?

消费者会向被指定为群组协调器的broker(不同消费者群组的协调器可能不同)发送心跳,以此来保持群组成员关系和对分区的所有权关系。心跳是由消费者的一个后台线程发送的,只要消费者能够以正常的时间间隔发送心跳,它就会被认为还“活着”。

如果消费者在足够长的一段时间内没有发送心跳,那么它的会话就将超时,群组协调器会认为它已经“死亡”,进而触发再均衡。如果一个消费者发生崩溃并停止读取消息,那么群组协调器就会在几秒内收不到心跳,它会认为消费者已经“死亡”,进而触发再均衡。在这几秒时间里,“死掉”的消费者不会读取分区里的消息。在关闭消费者后,协调器会立即触发一次再均衡,尽量降低处理延迟。

05. Kafka 如何避免消费者的分区再均衡?

真实应用场景中引发 rebalance 最常见的原因就是消费者组中新增或减少了消费者,特别是consumer崩溃的情况。这里的崩溃不一定就是指 consumer进程“挂掉”或consumer进程所在的机器宕机。以下两种情况也被视为消亡,我们要做的就是如何避免这两种不必要的 Rebalance 出现。

① 未及时发送心跳

由于消费者未能及时发送心跳,导致消费者被提出消费者组而导致的Rebalance,因此需要仔细地设置session.timeout.ms 和 heartbeat.interval.ms的值,这里给出一些推荐数值,可以“无脑”地应用在生产环境中。

(1) 设置 session.timeout.ms = 6s。
(2) 设置 heartbeat.interval.ms = 2s。

要保证消费者实例在被判定为死亡之前,能够发送至少 3 轮的心跳请求,即 session.timeout.ms >= 3 * heartbeat.interval.ms。将 session.timeout.ms 设置成 6s 主要是为了让 Coordinator 能够更快地定位已经挂掉的 Consumer。毕竟,我们还是希望能尽快揪出那些“尸位素餐”的 Consumer,早日把它们踢出 Group。

② 消费者消费时间过长,无法在指定的时间内完成消息的处理

之前有一个客户,在他们的场景中,消费者消费数据时需要将消息处理之后写入到 MongoDB。显然这是一个很重的消费逻辑。MongoDB 的一丁点不稳定都会导致消费者程序消费时长的增加。此时,max.poll.interval.ms 参数值的设置显得尤为关键。如果要避免非预期的 Rebalance,你最好将该参数值设置得大一点,比你的下游最大处理时间稍长一点。就拿 MongoDB 这个例子来说,如果写 MongoDB 的最长时间是 7 分钟,那么你可以将该参数设置为 8 分钟左右。

06. Kafka 消费者分区再均衡有什么影响?

① 影响消费者组的消费速度和吞吐量:消费者重新分配分区,可能会导致消费者停止消费一段时间,直到重新分配完成。

② 可能会产生消息重复消费:

因为Consumer消费分区消息的offset提交过程,不是实时的,由参数auto.commit.interval.ms控制提交的最小频率,默认是5000,也就是最少每5s提交一次。我们试想以下场景:提交位移之后的 3 秒发生了 Rebalance ,在 Rebalance 之后,所有 Consumer 从上一次提交的位移处继续消费,但该位移已经是 3 秒前的位移数据了,故在 Rebalance 发生前 3 秒消费的所有数据都要重新再消费一次。虽然可以通过减少 auto.commit.interval.ms 的值来提高提交频率,但这么做只能缩小重复消费的时间窗口,不可能完全消除它。

遗憾的是,目前kafka社区对于Reblance带来的影响,也没有彻底的解决办法。只能通过避免不必要的Rebalance减少影响。

07. Kafka 消费者分区再均衡的两种机制?

根据消费者群组所使用的分区分配策略的不同,再均衡可以分为两种类型。

① 主动再均衡 (range 、round-robin、sticky 分区分配策略)

在进行主动再均衡期间,所有消费者都放弃当前分配到的分区所有权,即停止读取消息。消费者重新加入群组,获得重新分配到的分区,并继续读取消息。这样可以确保消费者群组中的每个消费者都获得相同数量的分区,从而实现负载均衡。但这个过程会导致整个消费者群组在一个很短的时间窗口内不可用,这个时间窗口的长短取决于消费者群组的大小和几个配置参数。

② 协作再均衡(cooperative sticky 分区分配策略)

Kafka协作再均衡(也称为增量再均衡)用于在消费者组成员发生变化时重新分配分区。 协作再均衡机制只会重新分配发生变化的分区,而不是所有分区(比如一个消费者退出消费者组后,它所消费的分区会重新分区给其他消费者)。

协作再均衡通常是指将一个消费者的部分分区重新分配给另一个消费者,其他消费者则继续读取没有被重新分配的分区。在协作再均衡中,消费者群组首领会通知所有消费者,它们将失去部分分区的所有权,然后消费者会停止读取这些分区,并放弃对它们的所有权。接着,消费者群组首领会将这些没有所有权的分区分配给其他消费者,从而实现分区的重新分配。虽然这种增量再均衡可能需要进行几次迭代,直到达到稳定状态,但它避免了主动再均衡中出现的“停止世界”停顿。这对大型消费者群组来说尤为重要,因为它们的再均衡可能需要很长时间。

08. kafka 消费者分区再均衡协议

rebalance 本质上是一组协议。group 与 coordinator 共同使用这组协议完成group的rebalance。最新版本Kafka中提供了下面5个协议来处理rebalance相关事宜。

① JoinGroup请求:consumer请求加入组。
② SyncGroup请求:group leader把分配方案同步更新到组内所有成员中。
③ Heartbeat请求:consumer定期向coordinator汇报心跳表明自己依然存活。
④ LeaveGroup请求:consumer主动通知coordinator该consumer即将离组。
⑤ DescribeGroup 请求:查看组的所有信息,包括成员信息、协议信息、分配方案以及订阅信息等。该请求类型主要供管理员使用。coordinator不使用该请求执行rebalance。

在rebalance过程中,coordinator主要处理consumer发过来的JoinGroup和SyncGroup请求。当consumer主动离组时会发送LeaveGroup请求给coordinator。

在成功rebalance之后,组内所有consumer都需要定期地向coordinator发送Heartbeat请求。而每个 consumer也是根据 Heartbeat请求的响应中是否包含REBALANCE_IN_PROGRESS来判断当前group是否开启了新一轮rebalance。

09. kafka 消费者分区再均衡流程

目前 rebalance主要分为两步:加入组和同步更新分配方案。

① 加入组:组内所有 consumer 向 coordinator 发送 JoinGroup请求。当收集全 JoinGroup请求后,coordinator从中选择一个 consumer 担任group的leader,并把所有成员信息以及它们的订阅信息发送给leader。特别需要注意的是,group 的 leader 和coordinator 不是一个概念。leader 是某个consumer 实例,coordinator 通常是Kafka 集群中的一个 broker。另外 leader 而非coordinator负责为整个group的所有成员制定分配方案。

在这里插入图片描述

② 同步更新分配方案:group 的 leader 开始制定分配方案,即根据前面提到的分配策略决定每个consumer都负责哪些topic的哪些分区。一旦分配完成,leader会把这个分配方案封装进 SyncGroup 请求并发送给 coordinator。比较有意思的是,组内所有成员都会发送 SyncGroup请求,不过只有 leader发送的 SyncGroup请求中包含了分配方案。coordinator 接收到分配方案后把属于每个 consumer 的方案单独抽取出来作为SyncGroup请求的response返还给各自的consumer。

在这里插入图片描述

10. Kafka 消费者组固定成员是什么?

在默认情况下,消费者的群组成员身份标识是临时的。当一个消费者离开群组时,分配给它的分区所有权将被撤销;当该消费者重新加入时,将通过再均衡协议为其分配一个新的成员ID和新分区。

可以给消费者分配一个唯一的group.instance.id,让它成为群组的固定成员。通常,当消费者第一次以固定成员身份加入群组时,群组协调器会按照分区分配策略给它分配一部分分区。当这个消费者被关闭时,它不会自动离开群组——它仍然是群组的成员,直到会话超时。当这个消费者重新加入群组时,它会继续持有之前的身份,并分配到之前所持有的分区。群组协调器缓存了每个成员的分区分配信息,只需要将缓存中的信息发送给重新加入的固定成员,不需要进行再均衡。

如果两个消费者使用相同的group.instance.id加入同一个群组,则第二个消费者会收到错误,告诉它具有相同ID的消费者已存在。

如果应用程序需要维护与消费者分区所有权相关的本地状态或缓存,那么群组固定成员关系就非常有用。如果重建本地缓存非常耗时,那么你肯定不希望在每次重启消费者时都经历这个过程。更重要的是,在消费者重启时,消费者所拥有的分区不会被重新分配。在重启过程中,消费者不会读取这些分区,所以当消费者重启完毕时,读取进度会稍稍落后,但你要相信它们一定会赶上。

需要注意的是,群组的固定成员在关闭时不会主动离开群组,它们何时“真正消失”取决于session.timeout.ms参数。你可以将这个参数设置得足够大,避免在进行简单的应用程序重启时触发再均衡,但又要设置得足够小,以便在出现严重停机时自动重新分配分区,避免这些分区的读取进度出现较大的滞后。

11. Kafka 消费者分区再均衡的4种场景

① 新成员加入组:

在这里插入图片描述

② 组成员崩溃:

组成员崩溃和组成员主动离开是两个不同的场景。因为在崩溃时成员并不会主动地告知 coordinator 此事,coordinator 有可能需要一个完整的 session.timeout 周期才能检测到这种崩溃,这必然会造成 consumer 的滞后。可以说离开组是主动地发起 rebalance;而崩溃则是被动地发起rebalance。

在这里插入图片描述

③ 组成员主动离开组:

在这里插入图片描述

④ 提交位移:

在这里插入图片描述

相关文章:

分布式 - 消息队列Kafka:Kafka消费者分区再均衡(Rebalance)

文章目录 01. Kafka 消费者分区再均衡是什么?02. Kafka 消费者分区再均衡的触发条件?03. Kafka 消费者分区再均衡的过程?04. Kafka 如何判定消费者已经死亡?05. Kafka 如何避免消费者的分区再均衡?06. Kafka 消费者分区再均衡有什…...

BIO、NIO和AIO

一.引言 何为IO 涉及计算机核心(CPU和内存)与其他设备间数据迁移的过程,就是I/O。数据输入到计算机内存的过程即输入,反之输出到外部存储(比如数据库,文件,远程主机)的过程即输出。 I/O 描述了计算机系统…...

理解 Go 中的切片:append 操作的深入分析(篇1)

理解 Go 语言中 slice 的性质对于编程非常有益。下面,我将通过两个代码示例来解释切片在不同函数之间传递并执行 append 操作时的具体表现。 本篇为第 1 篇,当切片的容量 cap 充足时 第一份代码 slice1 的初始长度为 3,容量为 10 func main()…...

由于找不到mfc140u.dll,无法继续执行代码怎么修复?

当我在使用某个应用程序时遇到了mfc140u.dll缺失的错误提示时,我意识到这是由于该动态链接库文件丢失或损坏所引起的。mfc140u.dll是MFC的一部分,它包含了许多与用户界面、窗口管理、控件等相关的函数和类。这个文件通常用于支持使用MFC开发的应用程序的…...

【0.1】lubancat鲁班猫4刷入debian网络ping 域名不通问题

目录 1. 环境2. 操作步骤 1. 环境 lubancat4鲁班猫4 (4G0)不带emmc系统镜像lubancat-rk3588-debian11-gnome-20230807_update.img官方资料地址https://doc.embedfire.com/products/link/zh/latest/linux/ebf_lubancat.html 2. 操作步骤 从官网给的百度网盘下载linux系统全部…...

KafkaStream:基本使用

简介: kafkaStream:提供了对存储在kafka中的数据进行流式处理和分析的功能 特点: KafkasSream提供了一个非常简单轻量的Library,它可以非常方便的嵌入到java程序中,也可以任何方式打包部署 入门案例: 1、…...

【数据结构】二叉树

完全二叉树 是指所有结点度数小于等于2的树 所以这种情况也是: 几条性质 一个具有n个结点的完全二叉树的深度为: log ⁡ 2 ( n 1 ) 的结果向上取整。 \\\log_{2}(n1) \ \ 的结果向上取整。 log2​(n1) 的结果向上取整。设度为0的结点个数是n0&#…...

基于灰狼优化(GWO)、帝国竞争算法(ICA)和粒子群优化(PSO)对梯度下降法训练的神经网络的权值进行了改进(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

jenkins自动化构建保姆级教程(持续更新中)

1.安装 1.1版本说明 访问jenkins官网 https://www.jenkins.io/,进入到首页 点击【Download】按钮进入到jenkins下载界面 左侧显示的是最新的长期支持版本,右侧显示的是最新的可测试版本(可能不稳定),建议使用最新的…...

HTTPS 的加密流程

目录 一、HTTPS是什么? 二、为什么要加密 三、"加密" 是什么 四、HTTPS 的工作过程 1.对称加密 2.非对称加密 3.中间人攻击 4.证书 总结 一、HTTPS是什么? HTTPS (Hyper Text Transfer Protocol Secure) 是基于 HTTP 协议之上的安全协议&…...

Jmeter 参数化的几种方法

目录 配置元件-用户自定义变量 前置处理器-用户参数 配置元件-CSV Data Set Config Tools-函数助手 配置元件-用户自定义变量 可在测试计划、线程组、HTTP请求下创建用户定义的变量 全局变量,可以跨线程组调用 jmeter执行的时候,只获取一次&#xff0…...

剑指Offer45.把数组排成最小的数 C++

1、题目描述 输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。 示例 1: 输入: [10,2] 输出: “102” 示例 2: 输入: [3,30,34,5,9] 输出: “3033459” 2、VS2019上运行 先转换成字符串再组合起来 #in…...

【java毕业设计】基于SSM+MySql的人才公寓管理系统设计与实现(程序源码)--人才公寓管理系统

基于SSMMySql的人才公寓管理系统设计与实现(程序源码毕业论文) 大家好,今天给大家介绍基于SSMMySql的人才公寓管理系统设计与实现,本论文只截取部分文章重点,文章末尾附有本毕业设计完整源码及论文的获取方式。更多毕业…...

golang操作excel的高性能库——excelize/v2

目录 介绍文档与源码安装快速开始创建 Excel 文档读取 Excel 文档打开数据流流式写入 [相关 Excel 开源类库性能对比](https://xuri.me/excelize/zh-hans/performance.html) 介绍 Excelize是一个纯Go编写的库,提供了一组功能,允许你向XLAM / XLSM / XLS…...

学习51单片机怎么开始?

学习的过程不总是先打好基础,然后再盖上层建筑,尤其是实践性的、工程性很强的东西。如果你一定要先全面打好基础,再学习单片机,我觉得你一定学不好,因为你的基础永远打不好,因为基础太庞大了,基…...

[.NET学习笔记] -.NET6.0项目动态加载netstandard2.0报错但项目添加引用则正常的问题

问题描述 .NET6.0的项目使用netstandard2.0版本的动态链接库。若是在项目中直接添加引用,应用netstandard2.0项目或者netstandard2.0编译后的dll均能正常工作。但如果通过xcopy等方式,额外将对应的dll复制到执行目录,会执行失败。调用方式一…...

山景DSP芯片可烧录AP8224C2音频处理器方案

AP8224C2高性能32位音频应用处理器AP82系列音频处理器是面向音频应用领域设计的新一代SoC平台产品,适用于传统音响系统、新兴的蓝牙或Wifi 无线音频产品、Sound Bar 和调音台等市场。该处理器在总体架构和系统组成上,充分考虑了音频领域的特点&#xff0…...

来聊聊托管服务提供商(MSP)安全

纵观各个中小型企业,由于预算十分有限而且系统环境的满载,如今它们往往需要依赖托管服务提供商(managed service providers,MSP)来支持其IT服务与流程。而由于MSP提供的解决方案可以与客户端基础设施相集成&#xff0c…...

最新版本的Anaconda环境配置、Cuda、cuDNN以及pytorch环境一键式配置流程

本教程是最新的深度学习入门环境配置教程,跟着本教程可以帮你解决入门深度学习之前的环境配置问题。同时,本教程拒绝琐碎,大部分以图例形式进行教程。这里我们安装的都是最新版本~ 文章目录 一、Anaconda的安装1.1 下载1.2 安装1.3 环境配置…...

【数据结构与算法】十大经典排序算法-选择排序

🌟个人博客:www.hellocode.top 🏰Java知识导航:Java-Navigate 🔥CSDN:HelloCode. 🌞知乎:HelloCode 🌴掘金:HelloCode ⚡如有问题,欢迎指正&#…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

GraphQL 实战篇:Apollo Client 配置与缓存

GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...

PH热榜 | 2025-06-08

1. Thiings 标语:一套超过1900个免费AI生成的3D图标集合 介绍:Thiings是一个不断扩展的免费AI生成3D图标库,目前已有超过1900个图标。你可以按照主题浏览,生成自己的图标,或者下载整个图标集。所有图标都可以在个人或…...

MeshGPT 笔记

[2311.15475] MeshGPT: Generating Triangle Meshes with Decoder-Only Transformers https://library.scholarcy.com/try 真正意义上的AI生成三维模型MESHGPT来袭!_哔哩哔哩_bilibili GitHub - lucidrains/meshgpt-pytorch: Implementation of MeshGPT, SOTA Me…...

python打卡第47天

昨天代码中注意力热图的部分顺移至今天 知识点回顾: 热力图 作业:对比不同卷积层热图可视化的结果 def visualize_attention_map(model, test_loader, device, class_names, num_samples3):"""可视化模型的注意力热力图,展示模…...

短视频时长预估算法调研

weighted LR o d d s T p 1 − p ( 1 − p ) o d d s T p ( T p o d d s ∗ p ) o d d s p o d d s T o d d s odds \frac{Tp}{1-p} \newline (1-p)odds Tp \newline (Tp odds * p) odds \newline p \frac{odds}{T odds} \newline odds1−pTp​(1−p)oddsTp(Tpodds…...