Kafka消费者组和分区再均衡

news/2024/5/7 18:05:37/文章来源:https://blog.csdn.net/manformer/article/details/130050737

应用程序使用KafkaConsumer向Kafka订阅主题,并从订阅的Topic上接收消息。

要想知道如何从Kafka读取消息,需要先了解消费者和消费者组的概念。

1、消费者和消费者组

原因:假设我们有一个应用程序需要从一个Kafka Topic中读取消息并验证,然后再把它们保存起来。应用程序需要创建一个消费者对象,订阅Topic 并开始接收消息,然后验证消息并保存结果。过了一阵,生产者往Topic写入消息的速度超过了应用程序验证数据的速度,这时候怎么办?如果只使用单个消费者处理消息,应用程序会远远跟不上消息生成的速度。显然,此时很有必要对消费者进行横向伸缩。就像多个生产者可以向相同的分区写入消息一样,我们也可以使用多个消费者从一个主题读取消息,对消息进行分流

Kafka消费者从属于消费者组,一个群组里的消费者订阅的时同一个主题,每个消费者接收主题一部分分区的消息。

假设主题T1 有4个Partition,我们创建了消费者C1,它是群组G1里唯一的消费者,我们用它订阅主题T1。消费者C1将收到主题T1全部四个分区的消息。

 

如果在群组G1里新增一个消费者C2,那么每个消费者将分别从两个分区接收消息。假设消费者C1接收分区0和2的消息,消费者C2接收分区1和3的消息。

 

如果群组G1有4个消费者,那么每个消费者可以分配到一个分区。

 

如果群组G1中,再添加更多的消费者,超过主题的分区数量,那么有一部分消费者就会闲置,不会接收到任何消息。

 

往群组里增加消费者是横向伸缩消费能力的主要方式。Kafka消费者会经常做一些高延迟的操作,比如把数据写到数据库或者HDFS,或者使用数据进行比较耗时的计算。在这些情况下,单个消费者无法跟上数据生成的速度,所以可以增加更多的消费者,让它们分担负载,每个消费者只处理部分分区的消息,这就是横向伸缩的主要手段。
 

2、消费者群组和分区再均衡

我们上一节了解到,群组里的消费者共同读取主题的分区。一个新的消费者加入群组时,它读取的是原本由其他消费者读取的消息。当一个消费者被关闭或者发生崩溃时,它就离开群组,原本由它读取的分区将由群组里的其他消费者来读取。在主题发生变化时,比如管理员添加了新的分区,会发生分区重分配。

分区的所有权从一个消费者转移到另一个消费者,这样的行为被称为再均衡。再均衡非常重要,它为消费者群组带来了高可用和伸缩性,我们可以放心的添加或者删除消费者。不过在正常的情况下,我们并不希望发生这样的行为。因为在再均衡期间,消费者无法读取消息,造成整个消费者组一小段时间不可用。另外,当分区被重新分配给另一个消费者时,消费者当前的读取状态会丢失,它有可能还需要去刷新缓存,在它重新恢复状态之前会拖慢应用程序。

消费者通过向被指派为群组协调器的Broker(不同的群组可以有不同的协调器)发送心跳,来维持它们和群组的从属关系以及它们对分区的所有权关系。只要消费者以正常的时间间隔发送心跳,就被认为是活跃的,说明它还在读取分区里的消息。消费者会在轮询消息或提交偏移量时发送心跳。如果消费者停止发送心跳的时间足够长,会话就会过期,群组协调器认为它已经死亡,就会触发一次再均衡。

如果一个消费者发生崩溃,并停止读取消息,群组协调器就会等待几秒钟,确认它死亡了才会触发再均衡。在这几秒钟时间里,挂掉的消费者不会读取分区里的消息。在清理消费者时,消费者会通知协调器它将要离开群组,协调器会立即触发一次再均衡,尽量降低处理停顿。

心跳行为在最近版本中的变化

在0.10.1版本里,kafka社区引入了一个独立的心跳线程,可以在轮询消息的空档发送心跳。这样,发送心跳的频率(也就是消费者群组用于检测发生崩溃的消费者或不再发送心跳的消费者的时间)与消息轮询的频率(由处理消息所花费的时间来确定)之间就是相互独立的。

在新版本的Kafka中,可以指定消费者在离开群组并触发再均衡之前可以有多长时间不进行轮询,这样可以避免出现活锁,比如有时候应用程序并没有崩溃,只是由于某些原因导致无法正常运行。这个配置与session.timeout.ms是相互独立的,后者用于控制检测消费者发生崩溃的时间和停止发送心跳的时间。

分配分区是怎样的一个过程

当消费者要加入群组时,它会向群组协调器发送一个JoinGroup请求。第一个加入群组的消费者将成为"群主"。群主从协调器哪里获得群组的成员列表(列表里包含最近所有发过心跳的消费者),并负责给每一个消费者分配分区。它使用了一个实现了PartitionAssignor接口的类来决定那些分区应该被分配给那个消费者。

后面会介绍Kafka的分配策略。

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

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

相关文章

C++实现前缀树

文章目录1. 什么是前缀树2. 前缀树的实现2.1 前缀树的基本结构2.2 插入2.3 word出现了几次2.3 word作为前缀出现几次2.4 删除1. 什么是前缀树 假设这里有一个字符串数组,和一个树的根结点: 这个结点的pass意思是:有几个字符通过了这个结点。…

(学习日记)2023.4.10

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

Jetpack Compose之对话框和进度条

概述 对话框和进度条其实并无多大联系,放在一起写是因为两者的内容都不多,所以凑到一起,对话框是我们平时开发使用得比较多的组件,像隐私授权,用户点击删除时给用户提示这是一个危险操作等,进度条的使用频…

npm与node版本不匹配问题解决思路

1.报错 npm WARN EBADENGINE Unsupported engine { npm WARN EBADENGINE package: ‘electron-packager17.1.1’, npm WARN EBADENGINE required: { node: ‘> 14.17.5’ }, npm WARN EBADENGINE current: { node: ‘v12.22.9’, npm: ‘8.5.1’ } npm WARN EBADENGINE } np…

3款免费好用的电脑录屏工具

案例:电脑录屏工具哪款免费又好用? “我想要挑选一款适合自己的好用的电脑录屏软件,但是我尝试了很多款录屏软件结果都不尽人意。免费版的软件功能少,录制效果差,想要高级功能需要付费解锁。想问问大家有没有免费好用…

Mybatis操作Oracle中的Clob和Blob字段

文章目录Mybatis操作Oracle中的Clob和Blob字段1. Oracle中创建测试的表结构&#xff1a;Byte_Array_Test2. Mybatis配置MapperXml&#xff0c;用Map<String, Object>接受Clob和Blob的数据&#xff0c;如下图&#xff1a;3. 代码中获取Clob和Blob的值3-1 接收Blob和Clob数…

每日做题总结——day01

目录 选择题 for循环 指针数组 位段 getchar 大小端存储 进制与格式控制符 位运算 数组指针 二维数组的存储 计算二进制中1的个数 斐波那契数列求递归次数 编程题 删除公共字符 排序子序列 倒置字符串 选择题 for循环 解析&#xff1a;该题主要看for…

el-form, 时间选择器,不管选择什么时间范围,值一直是当月一号

yyyy-MM-DD 修改为 yyyy-MM-dd 就好了&#xff0c;bug千奇百怪 修改前 修改后

极致低延迟收集器ZGC探索——亚毫秒级,常数级暂停O(1)原理

ZGC 收集器 ZGC收集器&#xff08;Z Garbage Collector&#xff09;是由Oracle公司为HotSpot JDK研发的&#xff0c;最新一代垃圾收集器。有说法使用这个名目标是取代之前的大部分垃圾收集器&#xff0c;所以才叫ZGC&#xff0c;表示极致的Extremely&#xff0c;或者最后的&am…

RHCE——shell脚本练习

一.实验要求 1、判断web服务是否运行&#xff08;1、查看进程的方式判断该程序是否运行&#xff0c;2、通过查看端口的方式判断该程序是否运行&#xff09;&#xff0c;如果没有运行&#xff0c;则启动该服务并配置防火墙规则。 ​2、使用curl命令访问第二题的web服务&#xff…

Vulnhub靶场DC-1练习

目录0x00 准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用0x00 准备 下载链接&#xff1a;https://download.vulnhub.com/dc/DC-1.zip 介绍&#xff1a;There are five flags in total, but the ultimate goal is to find and read the flag in root’s home dir…

Linux宝塔安装msyql服务,默认密码,允许远程登录问题解决

一、首先我在宝塔安装mysql服务是5.7 1.1MySQL数据库5.6之前&#xff08;不包括&#xff09;默认密码为空&#xff0c;用户不用输入密码&#xff0c;直接回车登陆 mysql -uroot -p password:(空) 1.2.MySQL数据库5.6之后&#xff08;包括&#xff09;默认密码是MySQL数据库随机…

Springboot基础学习之(十四):修改使用数据库中的数据源,修改为Druid:通过Druid实现后台监控

文章的顺序&#xff0c;是本人学习Springboot这个框架的先后顺序 这一篇文章讲解的是如何整合数据库中的数据源 Java程序很大一部分要操作数据库&#xff0c;为了提高性能操作数据库的时候&#xff0c;又不得不使用数据库连接池。 Druid 是阿里巴巴开源平台上一个数据库连接池实…

web综合

一&#xff0c;基于域名访问www.openlab.com 在文件当中写入IP与域名的映射关系 在windows中写入 也可以在客户端的/etc/hosts下写入映射关系 创建目录 [rootserver ~]# mkdir -pv /www/openlab 将所需要的内容写入对应目录当中 [rootserver ~]# echo welcome to openlab ! &…

五分钟排查Linux的健康状态

五分钟排查Linux的健康状态1. CPU1.1 top命令1.2 什么是负载1.3 vmstat2. 内存2.1 观测命令2.2 CPU缓存2.3 HugePage2.4 预先加载3. I/O3.1 观测命令3.2 零拷贝4. 网络参考&#xff1a;《Linux运维实战》、xjjdog 操作系统作为所有程序的载体&#xff0c;对应用的性能影响是非常…

华为运动健康服务Health Kit 6.10.0版本新增功能速览!

华为运动健康服务&#xff08;HUAWEI Health Kit&#xff09;6.10.0 版本新增的能力有哪些&#xff1f; 阅读本文寻找答案&#xff0c;一起加入运动健康服务生态大家庭&#xff01; 一、 支持三方应用查询用户测量的连续血糖数据 符合申请Health Kit服务中开发者申请资质要求…

初识掌控板2.0、官方拓展板和配套编程软件mpython

不是广告&#xff01;&#xff01;不是广告&#xff01;&#xff01; 一、掌控板2.0概览 掌控板又名掌上联网计算机&#xff0c;是一款为青少年学习Python编程和创意制造&#xff0c;特别是物联网应用而设计的开源硬件。内置microPython开源嵌入式Python运行环境&#xff0c;可…

查询优化器:选择最优的查询路径

当我们通过解析器理解了SQL语句要干什么之后&#xff0c;接着会找查询优化器&#xff08;Optimizer&#xff09;来选择一个最优的查询路径。 可能有同学这里就不太理解什么是最优的查询路径了&#xff0c;这个看起来确实很抽象&#xff0c;当然&#xff0c;这个查询优化器的工…

C51单片机串口通信(概念部分)

1.通信的基本概念 1.1&#xff1a;串行通信与并行通信 &#xff08;1&#xff09;.串行通信 串行通信是指用一根数据线将 一个字节的八个bit位连接&#xff0c;从低位开始依次传输。 优点&#xff1a;成本便宜&#xff0c;传输稳定 缺点&#xff1a;速度慢 并行通信是指将一…

阿里云蔡英华:云智一体,让产业全面迈向智能

4月11日&#xff0c;在2023阿里云峰会上&#xff0c;阿里云智能首席商业官蔡英华表示&#xff0c;算力的飞速发展使数字化成为确定&#xff0c;使智能化成为可能。阿里云将以云计算为基石&#xff0c;以AI为引擎&#xff0c;参与到从数字化迈向智能化的划时代变革中。 基于服务…