Kafka消费者组和分区再均衡

news2024/11/24 14:29:51

应用程序使用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.coloradmin.cn/o/426229.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

14Exceptional Control Flow Exceptions and Process(异常控制流,异常和进程)

异常控制流 异常控制流出现的地方: 异常控制流(Exceptional Control Flow,ECF)是程序执行过程中由于某些特殊事件或条件而导致的控制流的改变。异常控制流通常出现在以下几种情况: 硬件异常和中断:硬件异…

14天手撸交互式问答数字人直播教程-课程计划

一、课程计划 二、时间安排 第01天:交互式问答数字人发展现状 从一个真实案例开始,介绍当前主流的交互式数字人平台,需求和应用场景,引入交互式数字人的交互流程和关键技术。后续整个直播系列的内容安排。 第02天:音…

Nvidia Orin刷机保姆级教程

文章目录前言一、刷机准备二、刷机实战1.刷机文件下载2.Orin进入刷机模式2.1拔掉Orin上所有线缆2.2插上type-c线缆2.3长按Force Recovery按钮2.4通电2.5松开2号按钮进入刷机模式2.6确认是否进入刷机模式3.命令行刷机3.1安装jetpack总结前言 使用Orin有段时间了,现在…

代码随想录_二叉树_leetcode236

leetcode 236. 二叉树的最近公共祖先 236. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、…

Windows主机信息搜集

注意:一切内容仅用于信息技术分享,切勿用于其他用途,一切后果与作者无关。 前言: 通过命令执行使用cs拿到了内网的一台主机,接下来我们进行内网的信息搜集。 1、内网环境分析 内网渗透: 在拿到webshell的…

机器学习——最大最小归一化

问:写出最小最大归一化公式,并对以下数据集进行最小最大归一化。x{6.3,9.2,-0.8,0.2,3.6}答: x_{min}-0.8 x_{max}9.2 将每个数据点应用最小最大归一化公式: $x_1{6.3-(-0.8)}/{9.2-(-0.8)}0.71 $x_2{9.2-(-0.8)}/{9.2-(-0.8)}1.0 $x_3…

PasteSpider之部署实际案例一则

本帖主要是介绍使用PasteSpider部署一个项目的过程,不一定会把所有问题都概括在内,但是至少是一个项目部署的完整流程和说明! 我们以PasteCode的网站作为一个项目为例子,绑定的域名为https://www.pastecode.cn/,项目包含了api端和…

ldap 组织结构如何转成多叉树?

工作中,ldap 服务器的对接,可以能会涉及到同步组织结构,认证,认证后处理等等,最近认证还不是我想写的刚需,继续来看看对于组织结构的想法 例如同步 AD 域的组织结构,或者是 ldap 协议的其他产品…

「计算机控制系统」2. 采样与数据保持

计算机控制系统中的信号 理想采样过程的数学描述 信号的恢复与重构 文章目录计算机控制系统中的信号基础知识A/D中的信号D/A中的信号理想采样过程的数学描述采样过程的描述理想采样信号的描述Shannon采样定理信号的恢复与重构Shannon重构法信号保持重构法计算机控制系统中的信号…

Java属性文件编码:处理非西欧语言字符的指南

Java属性文件是一种轻量级的配置文件格式,用于在Java应用程序中存储键值对数据。在Java中,Properties类提供了一种方便的方式来读取和写入属性文件。 在Java中,属性文件通常使用ISO-8859-1字符集编码。这意味着如果您希望在属性文件中使用非…

中科图新BIM+GIS数字化设计施工管理解决方案

一、引言: 公路项目对施工质量和风险控制要求高,但涉及专业、队伍、机械等众多因素,导致施工质量与安全控制困难。必须提前应对并做好过程中的管控,信息化系统可支持记录和管理数据。 二、中科图新BIMGIS智慧施工管理平台 中科图…

docker容器的相关环境及创建镜像1

一、容器管理工具介绍 LXC 2008 是第一套完整的容器管理解决方案 不需要任何补丁直接运行在linux内核之上管理容器。创建容器慢,不方便移植 Docker 是在LXC基础上发展起来的。拥有一套容器管理生态系统 生态系统包含︰容器镜像、注册表、RESTFUL API及命令行操作界…

Python算法设计 - McCarthy 91

目录一、什么是 McCarthy 91二、有什么用?三、Python算法实现四、作者Info一、什么是 McCarthy 91 McCarthy 91 是一个递归的函数表达式如下 函数的意思是当输入一个大于 100 的数字 n 时返回 n-10,而当输入一个小于等于101的数字 n 时递归的对 n 进行…

QT之widget窗口标题与项目构建目标位置修改

文章目录widget窗口标题修改方法一,直接通过UI界面修改方法二,通过代码修改结果展示,选择其中一种方法即可构建项目生成文件目标位置修改1. 首先选择——>项目,如图所示:2.打开后选择构建设置——>编辑构建位置&…

【VScode】手把手教你如何搭建C/C++开发环境

目录 1.VScode是什么 2.VScode的下载和安装 安装中文插件 3.VScode配置C/C开发环境 3.1 下载MinGW-w64 编译器套件 3.2 配置MinGW-w64 3.3 安装C/C插件 4.在VScode上编写C语言代码并编译成功 4.1打开文件夹 4.2 新建C语言文件,编写C语言代码 4.3设置C/…

vue3项目中使用pinia

vuex 4pinia 小菠萝 vuex和之前vue2使用一致 1.import { createStore } from vuex 引入文件不同vue3组件setup写法vuex提供了hook //组件中操作store import { useStore } from vuex //提交mutations 进行修改 store.commit(increment), //dispatch 触发action 同步或者异步提交…

【C】Process Control

系列连载 【python / C / C】 参考 《C语言程序设计(第四版)谭浩强》【C语言】C语言视频教程《郝斌 C 语言自学教程》 文章目录1 什么是流程控制2 流程控制的分类2.1 顺序执行2.2 选择执行2.3 循环执行2.3.1 for2.3.2 while2.3.3 do...while2.3.4 swi…

[ 汇编语言 (一) ] —— 踩着硬件的鼓点,掌握计算机的精髓

🙌秋名山码民的主页 😂一个打过一年半的oier,写过一年多的Java,现在致力于学习iot应用的普通本科生 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 🙏作者水平有限,如发现…

数据库系统工程师——第二章 程序语言基础知识

文章目录📂 第二章、程序语言基础知识 📁 2.1 程序语言概述 📖 2.1.1 程序语言的基本概念 📖 2.1.2 程序语言的基本成分 📁 2.2 程序语言翻译基础 📖 2.2.1 汇编程序基本原理 📖 2.2.2 编译程序…

算法之归并排序

文章目录一、归并排序(递归版)二、归并排序(非递归版)一、归并排序(递归版) 归并排序思想:将数组划分为两个区间,左区间,右区间 然后对这两个区间内容进行排序 &#xff…