Kafka的rebalance机制

1、什么是 rebalance 机制
重平衡(rebalance)机制规定了如何让消费者组下的所有消费者来分配 topic 中的每一个分区。
 

2、rebalance 机制的触发条件是什么
(1)消费者组内成员变更
成员增加:当有新的消费者加入到消费者组时,会触发重平衡以重新分配分区。
成员减少
主动离组:某个消费者调用 close() 方法显式退出消费者组。
被动离组:由于网络故障、应用程序崩溃或其他原因导致消费者无法发送心跳请求给协调者(Coordinator),超过一定时间(session.timeout.ms 或 max.poll.interval.ms),协调者认为该消费者已死亡并将其移除。
(2)订阅 topic 的数量发生变化
如果消费者组使用正则表达式订阅了多个 topic,并且新增了一个符合该模式的新 topic,这将触发 rebalance 以便新主题的分区可以被分配给现有消费者。
(3)订阅 topic 的分区数发生变化
当某个 topic 的分区数增加时(Kafka 支持动态增加分区),为了使新增加的分区能够被合理分配,也会触发 rebalance。
 

3、rebalance 机制的影响是什么
(1)消费中断
消息消费暂停:rebalance 过程中,所有消费者都会暂时停止,直到新的分配方案确定并生效。
(2)资源消耗增加
网络流量增加:rebalance 期间,消费者需要重新建立与协调者(Coordinator)的连接,并接收新的分区分配信息。这会生成额外的网络流量。
CPU 和内存使用上升:频繁的 rebalance 会导致更多的 CPU 和内存用于处理心跳请求、位移提交以及重新分配逻辑,增加了 Broker 和消费者负载。
(3)延迟增大
由于消息消费暂停,已经到达但尚未处理的消息会被延迟处理,可能导致端到端的延迟增加。
 

4、如何减少 rebalance 的发生
rebalance 的触发条件中,2 和 3 可以人为约定规范的方式来减少 rebalance,但往往第一种情况才是引起 rebalance 的最常见原因

除了消费者成员正常的添加和停止之外,还有些情况下 Coordinator 会错误的认为消费者组成员已停止而将其踢出组以致发生 rebalance。

我们知道维持分布式系统的方式通常是通过发送心跳的,kafka也不例外。
由于一些问题,你可能不清楚没接收到心跳的原因,比如是因为对方真正挂了还是只因为当时负载过高或网络堵塞没来得及发心跳等。所以一般会约定一个时间,超时即判定对方挂了。而在 kafka 消费场景中,session.timout.ms 参数就是规定这个超时时间的。

另外一个参数是 heartbeat.interval.ms,它控制发送心跳的频率,频率越高越不容易被误判,当然代价是会消耗更多资源。

此外,还有一个参数,max.poll.interval.ms,我们知道消费者 poll 数据后,需要进行处理然后再拉取。但如果两次拉取时间间隔超过这个参数的值,那消费者就会被踢出消费者组。也就是说处理时间不能超过 max.poll.interval.ms。该参数的默认值是 5 分钟,如果消费者接收到数据后会执行耗时操作,则应将其设置得大些。

总结一下几个参数
在这里插入图片描述

通过上述可知,一般建议如下
(1)heartbeat.interval.ms < session.timeout.ms:确保心跳间隔足够短,以便及时发现消费者故障,但又不会过于频繁发送心跳请求,增加网络开销。
(2)max.poll.interval.ms > 处理时间:确保这个值大于消费者处理消息所需最大时间,以避免由于处理时间过长而被误认为死亡。
 

5、rebalance 的三种策略
(1)Range
基于每个主题的分区分配,先对同一个 topic 里面的分区按照序号排序,并对消费者按照字母序进行排序。假如一个 topic下有 10 个分区,3 个消费者,排序后的分区是 0,1,2,3,4,5,6,7,8,9,消费者排序完之后将会是C1, C2, C3。通过 partition数/consumer数 来决定每个消费者应该消费几个分区。如果除不尽,那么前面消费者将会多消费 1 个分区。

例如,10/3 = 3 余 1 ,除不尽,那么 消费者 C1 便会多消费 1 个分区,最终分配结果如下:
C1 0,1,2,3 分区
C2 4,5,6 分区
C3 7,8,9 分区(如果有11 个分区的话,C1 将消费 0,1,2,3 分区,C2 将消费4,5,6,7 分区 C3 将消费 8,9,10 分区)

Range 的弊端:
如上,只是针对 1 个 topic 而言,C1 消费者多消费 1 个分区影响不是很大。如果有 N 个 topic,那么针对每个 topic,消费者 C1 都将多消费 1 个分区,topic 越多,C1 消费的分区会比其他消费者明显多 N 个分区。

(2)RoundRobin(默认策略)
轮询分区,kafka 默认的 rebalance 策略,把所有的 partition 和 consumer 都列出来,通过轮询来分配 partition 到消费者。

轮询分区分为如下两种情况:
①同一消费组内所有消费者订阅的 topic 都是相同的
②同一消费者组内的消费者订阅的 topic 不同
对于第一种情况,RoundRobin 策略的分区分配是均匀的。

例如:同一消费者组中,有 3 个消费者 C0、C1 和 C2,都订阅了 2 个主题 t0 和 t1,并且每个主题都有 3 个分区(p0、p1、p2),那么所订阅的所以分区可以标识为t0p0、t0p1、t0p2、t1p0、t1p1、t1p2。最终分区分配结果如下:
消费者C0 消费 t0p0 、t1p0 分区
消费者C1 消费 t0p1 、t1p1 分区
消费者C2 消费 t0p2 、t1p2 分区

对于第二种情况,可能会导致分区分配不均匀。如果某个消费者没有订阅消费组内的某个 topic,那么在分配分区的时候,此消费者将不会分配到这个 topic 的任何分区。

例如:同一消费者组中,有 3 个消费者 C0、C1 和 C2,他们共订阅了 3 个主题:t0、t1 和 t2,这 3 个主题分别有 1、2、3 个分区(即:t0有1个分区(p0),t1有 2 个分区(p0、p1),t2 有 3 个分区(p0、p1、p2)),即整个消费者所订阅的所有分区可以标识为 t0p0、t1p0、t1p1、t2p0、t2p1、t2p2。具体而言,消费者 C0 订阅的是主题 t0,消费者 C1 订阅的是主题 t0 和 t1,消费者 C2 订阅的是主题 t0、t1 和t2,最终分区分配结果如下:
消费者C0 消费 t0p0
消费者C1 消费 t1p0 分区
消费者C2 消费 t1p1、t2p0、t2p1、t2p2 分区

(3)Sticky
粘性分配策略,主要是为了让目前的分配尽可能保持不变,只挪动尽可能少的分区来实现重平衡。

举例,有三个消费者 C0,C1,C2 。三个主题 t0,t1,t2,t3。每个主题各有两个分区, t0p0,t0p1,t1p0,t1p1,t2p0,t2p1,t3p0,t3p1。
现在订阅情况如下:
C0:t0p0,t1p1,t3p0
C1:t0p1,t2p0,t3p1
C2:t1p0,t2p1
假设现在 C1 挂掉了,如果是 RoundRobin 分配策略,那么会变成下面这样:
C0:t0p0,t1p0,t2p0,t3p0
C2:t0p1,t1p1,t2p1,t3p1
就是说它会全部重新打乱,再分配,而如果使用 Sticky 分配策略,会变成这样:
C0:t0p0,t1p1,t3p0,t2p0
C2:t1p0,t2p1,t0p1,t3p1

也就是说,尽可能保留了原来的分区情况,不去改变它,在这个基础上进行均衡分配。

 
 
 
 

大佬,点个赞在走呗!
 
 

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/947158.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

人工智能之基于阿里云图像人脸融合部署

人工智能之基于阿里云图像人脸融合部署 需求描述 基于阿里云搭建图像人脸融合模型&#xff0c;模型名称&#xff1a;iic/cv_unet-image-face-fusion_damo使用上述模型输出人脸融合照片 模型路径&#xff1a;人脸融合 业务实现 阿里云配置 阿里云配置如下&#xff1a; SD…

如何利用无线路由器实现水泵房远程监测管理

水泵站广泛部署应用在工农业用水、防洪、排涝和抗旱减灾等方面&#xff0c;如果水泵站发生异常&#xff0c;往往会对生产生活造成诸多损失&#xff0c;甚至引发安全事故。因此&#xff0c;建立一套高效、可靠的泵站远程监测管理系统至关重要。 方案背景 目前&#xff0c;我国大…

Unity Canvas中显示粒子特效

首先在场景中新建一个粒子特效 修改一下参数 1.改变粒子特效的渲染层级,层级修改为UI层,由UI相机渲染 使用粒子特效的Sorting Layer ID和Order In Layer,Sorting Layer ID设置为UI(如果没有UI层则新建就好了),对UI进行排序 对于要显示在前的UI组件添加Canvas组件,设置O…

Spring Cloud Security集成JWT 快速入门Demo

一、介绍 JWT (JSON Web Token) 是一种带有绑实和信息的简单标准化机制&#xff0c;在信息通信中用于验证和信息传递。尤其在应用中使用Spring Cloud实现分布式构建时&#xff0c;JWT可以作为一种无状态验证原理的证明。 本文将进一步描述如何在Spring Cloud Security中集成JW…

逻辑数据模型设计过程包含哪些任务?

逻辑数据模型设计是数据库开发周期中的一个关键环节&#xff0c;它位于需求分析之后、物理数据模型设计之前。这一步骤的主要目标是构建一个准确反映业务需求、结构清晰且易于理解的数据模型。本文将深入探讨逻辑数据模型设计过程所包含的各项任务&#xff0c;结合理论与实践&a…

CAT3D: Create Anything in 3D with Multi-View Diffusion Models 论文解读

24年5月的论文&#xff0c;上一版就是ReconFusion 目录 一、概述 二、相关工作 1、2D先验 2、相机条件下的2D先验 3、多视角先验 4、视频先验 5、前馈方法 三、Method 1、多视角扩散模型 2、新视角生成 3、3D重建 一、概述 该论文提出一种CAT3D方法&#xff0c;实现…

GitHub 及 GitHub Desktop 详细使用教程(通俗易懂)

目录 Δ前言 一、Github教程 1.什么是Github&#xff1f; 2.仓库和对仓库的操作&#xff1a; 2.1 Repository&#xff08;仓库&#xff09; 2.2 Fork&#xff08;派生&#xff09; 2.3 Star&#xff08;收藏&#xff09; 2.4 Watch&#xff08;追番&#xff09; 2.5 Issue&am…

Shell-概述、脚本、变量、数值运算

概述 一、什么是shell 在 Linux 内核与用户之间的解释器程序 通常指 /bin/bash负责向内核翻译及传达用户/程序指令相当于操作系统的“外壳” 二、shell的使用方式 交互式 —— 命令行 ---人工干预、智能化程度高 ---逐条解释执行、效率低 非交互式 —— 脚本 ---需要提前…

刷机TP TP-Link-WDR5660【持续更新】

上文中简单介绍了&#xff1a;路由器刷机TP-Link tp-link-WDR5660 路由器升级宽带速度-CSDN博客 步骤如下&#xff1a; 第一步&#xff1a;安装Linux系统 本文使用virtualBox 安装Ubuntu的debian系统&#xff0c;本文不在讲述章 请自行参考&#xff1a;Kali 安装之腾讯云经…

信息科技伦理与道德1:研究方法

1 问题描述 1.1 讨论&#xff1f; 请挑一项信息技术&#xff0c;谈一谈为什么认为他是道德的/不道德的&#xff0c;或者根据使用场景才能判断是否道德。判断的依据是什么&#xff08;自身的道德准则&#xff09;&#xff1f;为什么你觉得你的道德准则是合理的&#xff0c;其他…

如何不修改模型参数来强化大语言模型 (LLM) 能力?

前言 如果你对这篇文章感兴趣&#xff0c;可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」&#xff0c;查看完整博客分类与对应链接。 大语言模型 (Large Language Model, LLM, e.g. ChatGPT) 的参数量少则几十亿&#xff0c;多则上千亿&#xff0c;对其的训…

css实现垂直文本

效果 知识 writing-mode: <value>; 可选值 horizontal-tb: 默认值。文本从左到右&#xff08;或从右到左&#xff09;排列&#xff0c;然后从上到下。vertical-rl: 文本从上到下排列&#xff0c;然后从右到左。适用于垂直书写的方向&#xff0c;如日语和中文。vertica…

【C++/控制台】扫雷

源代码&#xff1a; #include <windows.h> #include <conio.h> #include <stdio.h> int S, W 9, H 9, B 10, s, p 0, c 1, i, *m, *M, (*f)(int, int), *O; int edge(int x, int y) { return x < 0 || W < x || y < 0 || H < y; } void tm…

spring-boot启动源码分析(二)之SpringApplicationRunListener

在上一篇《spring-boot启动源码分析&#xff08;一&#xff09;之SpringApplication实例构造》后&#xff0c;继续看了一个月的Spring boot启动源码&#xff0c;初步把流程看完了&#xff0c;接下来会不断输出总结&#xff0c;以巩固这段时间的学习。同时也希望能帮到同样感兴趣…

计算机网络 (20)高速以太网

一、发展背景 随着计算机技术和网络应用的不断发展&#xff0c;传统的以太网速率已逐渐无法满足日益增长的带宽需求。因此&#xff0c;高速以太网应运而生&#xff0c;它以提高数据传输速率为主要目标&#xff0c;不断推动着以太网技术的发展。 二、技术特点 高速传输&#xff…

svn分支相关操作(小乌龟操作版)

在开发工作中进行分支开发&#xff0c;涉及新建分支&#xff0c;分支切换&#xff0c;合并分支等 新建远程分支 右键选择branch/tagert按钮 命名分支的路径名称 点击确定后远程分支就会生成一个当时命名的文件夹&#xff08;开发分支&#xff09; 分支切换 一般在开发阶段&a…

非关系型数据库和关系型数据库的区别

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

redux react-redux @reduxjs/toolkit

redux团队先后推出了redux、react-redux、reduxjs/toolkit&#xff0c;这三个库的api各有不同。本篇文章就来梳理一下当我们需要在项目中集成redux&#xff0c;从直接使用redux&#xff0c;到使用react-redux&#xff0c;再到react-redux和reduxjs/toolkit配合使用&#xff0c;…

【论文+源码】一个基于SSM(Spring + Spring MVC + MyBatis)的公寓电能计量系统

为了实现一个基于SSM&#xff08;Spring Spring MVC MyBatis&#xff09;的公寓电能计量系统&#xff0c;我们需要创建一个简单的Web应用程序来记录和显示每个公寓的电能使用情况。以下是一个基本的实现示例。 我们将包括以下几个部分&#xff1a; 数据库表设计实体类DAO层…

将simpletex 识别的公式 复制到ppt 中

1&#xff09;点击 复制MathML(word) 2&#xff09;右击粘贴到任意word 中 3&#xff09;将word公式粘到 office (2019) 的ppt 中 线上识别链接&#xff1a;SimpleTex - Snip & Get!