Kafka 源码分析——Consumer

文章目录

  • 前言
  • Consumer 消费流程
  • Consumer初始化
  • 如何选举Consumer Leader
  • 消费者分区策略
  • Consumer拉取数据
  • 提交偏移量

前言

当生产者将消息发送到Broker时,这些消息将被存储在磁盘上。消费者是如何消费这些消息呢?

Consumer 消费流程

image.png
站在源码的核心角度,可以把Consumer分成以下几个核心部分:

  1. Consumer初始化
  2. 如何选举Consumer Leader
  3. Consumer Leader是如何指定分区
  4. Consumer如何拉取数据
  5. Consumer偏移量提交

Consumer初始化

从KafkaConsumer的构造方法出发,跟踪到核心实现方法

image.png

这个方法的前面代码部分都是一些配置

Consumer与Broker的核心通讯组件

image.png

ConsumerCoordinator:在Kafka消费中是组消费,协调器在具体进行消费之前要做很多的组织协调工作。

image.png

Fetcher:提取器,因为Kafka消费是拉数据的,所以这个Fetcher就是拉取数据的核心类

image.png

这个核心类中,有很多很多的参数设置,这些就跟消费的配置有关系

fetch.min.bytes

每次fetch请求时,server应该返回的最小字节数。如果没有足够的数据返回,请求会等待,直到足够的数据才会返回,缺省为1个字节。多消费者下,可以设大这个值,以降低broker的工作负载。

fetch.max.bytes

每次fetch请求时,server应该返回的最大字节数。这个参数决定了可以成功消费到的最大数据。

比如这个参数设置的是50M,那么consumer能成功消费50M以下的数据,但是最终会卡在消费大于10M的数据上无限重试。fetch.max.bytes一定要设置到大于等于最大单条数据的大小才行。

image.png

fetch.wait.max.ms

如果没有足够的数据能够满足fetch.min.bytes,则此项配置是指在应答fetch请求之前,server会阻塞的最大时间。缺省为500毫秒。和上面的fetch.min.bytes结合起来。

max.partition.fetch.bytes

指定了服务器从每个分区里返回给消费者的最大字节数,默认1MB。

假设一个主题有20个分区和5个消费者,那么每个消费者至少要有4MB的可用内存来接收记录,而且一旦有消费者崩溃,这个内存还需更大。注意,这个参数要比服务器的message.max.bytes更大,否则消费者可能无法读取消息。

max.poll.records

控制每次poll方法返回的最大记录数量。

image.png

如何选举Consumer Leader

消费者协调器与组协调器的通讯

image.png

image.png

image.png

image.png

image.png

向Broker发送请求

image.png
对Broker响应进行处理
image.png

消费者协调器发起入组请求

image.png

image.png

image.png

image.png

image.png

消费者分区策略

partition.assignment.strategy,分区分配给消费者的策略。默认为Range。允许自定义策略。

Range

把主题的连续分区分配给消费者。(如果分区数量无法被消费者整除、第一个消费者会分到更多分区)

RoundRobin

把主题的分区循环分配给消费者。

image.png

StickyAssignor:初始分区,和RoundRobin是一样。每一次分配变更相对上一次分配做最少的变动。

目标:

1、分区的分配尽量的均衡

2、每一次重分配的结果尽量与上一次分配结果保持一致

当这两个目标发生冲突时,优先保证第一个目标

比如有3个消费者(C0、C1、C2)、4个topic(T0、T1、T2、T34),每个topic有2个分区(P1、P2)

image.png

自定义策略

extends 类AbstractPartitionAssignor,然后在消费者端增加参数:

properties.put(ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG,类.class.getName());

分区策略源码分析

image.png

image.png

image.png

image.png

image.png

Consumer拉取数据

拉取数据核心Fetch类

image.png

image.png

image.png

提交偏移量

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

当然,自动提交auto.commit.interval.ms

image.png

默认5s

image.png

maybeAutoCommitOffsetsAsync 最后这个就是poll的时候会自动提交,而且没到auto.commit.interval.ms间隔时间也不会提交,如果没到下次自动提交的时间也不会提交。

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

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

相关文章

java版工程管理系统Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码

工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&am…

Gin学习记录4——Controller和中间件

一. Controller 用不同的Controller可以实现业务的分类,不同类型的请求可以共用同一套中间件 1.1 单文件Controller 几乎等同于函数封装,直接将ctrl的代码写入到一个文件里然后调用: package adminimport ("net/http""git…

FP树 高效发现频繁项集

1:a,b,c,d,e 2:a,b,c 3:e,f 4:b,c,d,e 现将其建立FP树 计算支持度 a2,b3,c3,d2,e2,f1 剔除支持度1的,再排序 b3,c3,a2,d2,e2 1:b,c,a,d,e 2:b,c,a 3:e 4:b,c…

无人机“长坡”上,谁是滚出“厚雪球”的长期主义者?

“股神”巴菲特,曾提出过“长坡厚雪”的理论: 人生就像滚雪球,重要的是发现很湿的雪和很长的坡。 运用到企业经营上,“长坡”指的是企业所布局的领域发展潜力足、空间大;而“湿雪”,指的是企业竞争力强、…

大模型应用发展的方向|代理 Agent 的兴起及其未来(下)

“ 借助LLM作为代理大脑的优势,探讨了单一代理、多代理系统和人机协作等应用场景,探讨了代理的社会行为、心理活动以及在模拟社会环境中观察新兴社会现象和人类洞见的可能性。” 01 — 造福人类:代理实践 LLM型智能代理是一种新兴的方向&…

Linux——文件系统

✅<1>主页&#xff1a;&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;Linux——文件系统 ☂️<3>开发环境&#xff1a;Centos7 &#x1f4ac;<4>前言&#xff1a;上期我们了解了文件在内存中得组织方式&#xff0c;那么文件在磁盘中…

【C语言】错题本(4)

一. 题目及选项: 答案解析: 知识点: 字符型在内存中的数据存储 char类型数据在内存中的图示: unsigned char类型数据在内存中的图示: 二. 题目及选项: 答案解析: A: B: C: D: 三. 题目及选项: 答案解析: 数据在计算机中是先转换成补码,再进行运算的!

C语言自定义类型详解(1)结构体知识汇总

本篇概要 本篇主要讲述C语言结构体的相关知识&#xff0c;包括结构体的基本声明&#xff0c;结构体的匿名结构&#xff0c;结构体的自引用&#xff0c;结构体变量的定义和初始化以及结构体的内存对齐等相关知识。 文章目录 本篇概要1.结构体1.1结构体的基本声明1.2结构体的特殊…

精华回顾:Web3 前沿创新者在 DESTINATION MOON 共话未来

9 月 17 日&#xff0c;由 TinTinLand 主办的「DESTINATION MOON: Web3 Dev Summit Shanghai 2023」线下活动在上海黄浦如约而至。 本次 DESTINATION MOON 活动作为 2023 上海区块链国际周的 Side Event&#xff0c;设立了 4 场主题演讲与 3 个圆桌讨论&#xff0c;聚集了诸多…

高压放大器电源有什么作用和用途

高压放大器是一种专门用于放大高压信号的电子设备。它可以将低幅度的输入信号放大成高幅度的输出信号&#xff0c;用于驱动高压负载或处理高压信号。然而&#xff0c;高压放大器需要特定的电能来运行&#xff0c;而这就是电源的作用。 高压放大器电源的主要作用是为高压放大器提…

Linux常用命令—find命令大全

文章目录 一、find命令常用功能1、find命令的基本信息如下。2、按照文件名搜索3、按照文件大小搜索4、按照修改时间搜索5、按照权限搜索举例&#xff1a;6、按照所有者和所属组搜索7、按照文件类型搜索8、逻辑运算符 一、find命令常用功能 1、find命令的基本信息如下。 命令名…

伪原创文章生成器软件的崛起-哪个伪原创文章生成器软件好?

在当今数字化的时代&#xff0c;内容创作已经成为了无处不在的需求。不论您是个人博主、企业家还是网站管理员&#xff0c;都会面临一个共同的挑战&#xff1a;如何在互联网上脱颖而出&#xff0c;吸引更多的读者和访客。 gpt批量图文改写润色软件-147SEO gpt批量图文改写润色…

栈的简单应用(利用Stack进行四则混合运算)(JAVA)

目录 中缀表达式转后缀表达式 图解 代码实现过程&#xff1a; 完整代码&#xff1a; 利用后缀表达式求值&#xff1a; 完整代码&#xff1a; 首先我们得先了解逆波兰表达式。 中缀表达式转后缀表达式 所谓的中缀表达式其实就是我们平时写的例如&#xff1a;&#xff1…

ReadPaper论文阅读工具

之前看文献一直用的EndNote嘛&#xff0c;但是突然发现了它的一个弊端&#xff0c;就是说每次没看完退出去之后&#xff0c;下次再接着看的时候它不能保留我上一次的位置信息&#xff0c;又要重头开始翻阅&#xff0c;这让我感到很烦躁哈哈。&#xff08;当然也不知道是不是我哪…

自研多模态追踪算法 PICO 为「手柄小型化」找到新思路

作者&#xff1a;张韬、林泽一 、闻超 、赵洋 研发背景 作为头戴的追踪配件&#xff0c;VR手柄可以通过HMD&#xff08;头戴显示设备&#xff09;的inside-out光学追踪定位原理&#xff0c;计算出手柄的空间运动轨迹&#xff0c;同时结合6轴传感器实现6DoF空间定位。与此同时&a…

基于若依ruoyi-nbcio增加flowable流程待办消息的提醒,并提供右上角的红字数字提醒(六)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 这个部分主要是前端方面的。 1、在Navbar.vue显示右上角的图标栏里增加一项显示消息提醒的组件 <el-…

【PyTorch攻略(2/7)】 加载数据集

一、说明 PyTorch提供了两个数据原语&#xff1a;torch.utils.data.DataLoader和torch.utils.data.Dataset&#xff0c;允许您使用预加载的数据集以及您自己的数据。数据集存储样本及其相应的标签&#xff0c;DataLoader 围绕数据集包装一个可迭代对象&#xff0c;以便轻松访问…

c++STL案列一评委打分

案例描述 有5名选手:选手ABCDE&#xff0c;10个评委分别对每一名选手打分&#xff0c;去除最高分&#xff0c;去除评委中最低分&#xff0c;取平均分 实现步骤 1.创建五名选手&#xff0c;放到vector中 2.遍历vector容器&#xff0c;取出来每一个选手&#xff0c;执行for循环…

autosar 诊断入门

AUTOSAR (汽车开放系统架构) 是一个国际汽车行业的开放和标准化的软件架构。它的主要目标是为了创建一种独立于硬件的软件架构&#xff0c;以提高汽车电子系统的模块化和可重用性。 AUTOSAR架构主要分为两个部分&#xff1a;AUTOSAR Runtime Environment (RTE) 和 AUTOSAR Soft…

第一百五十一回 自定义组件综合实例:游戏摇杆二

文章目录 内容回顾实现方法位置细节示例代码我们在上一章回中介绍了如何实现 游戏摇杆相关的内容,本章回中将继续介绍这方面的知识.闲话休提,让我们一起Talk Flutter吧。 内容回顾 我们在上一章回中介绍了游戏摇杆的概念以及实现方法,并且通过示例代码演示了实现游戏摇杆的…