基于Kafka2.1解读Producer原理

news2024/11/28 11:52:13

文章目录

  • 前言
  • 一、Kafka Producer是什么?
  • 二、主要组件
    • 1.Kafka Producer
      • 1.1 partitioner
      • 1.2 keySerializer
      • 1.3 valueSerializer
      • 1.4 accumulator
      • 1.5 sender
    • 2.Sender
      • 2.1 acks
      • 2.2 client
      • inFlightBatches
    • 3. Selector
      • 3.1 nioSelector
      • 3.2 channels
    • 4. 全局总览
  • 总结


前言

相信现在的javer对于Kafka应该都很熟悉了,不管是八股文还是工作中使用。虽然Kafka server是scala写的,但是client是java写的,所以咱们理解client的代码还是比较容易的,今天先来基于源码解读下Kafka Producer的主体流程


一、Kafka Producer是什么?

这个应该不用过多介绍了吧,我们发送消息到MQ就是通过Kafka Producer来实现的。

二、主要组件

1.Kafka Producer

Kafka Producer的主要流程

1.1 partitioner

partitioner的作用是用来对发送的消息进行partition选择的,譬如msg要发送某个topic,topic里有多个partition,需要选择发往哪个partition。
如果我们发送消息时设置了partition key,那么就按照partition key进行hash,然后选择发送的partition
如果没有设置partition key,那么就默认使用轮询的方式来选择partition

1.2 keySerializer

顾名思义,就是对key进行序列化的工具类。因为我们的数据需要发送到网络里,所以数据必须序列化成二进制,所以需要进行序列化

1.3 valueSerializer

同上,和keySerializer类似的作用

1.4 accumulator

accumulator是比较重要的一个组件,主要功能包括:

  1. 选择/创建需要append数据的batch
  2. 把msg添加到该batch里面,获得batch里produceFuture

1.5 sender

sender是真正执行消息发送的组件,主要功能包括:

  1. 把可以发送的batch,组装成clientRequest,给底层的nioSelector注册写事件
  2. nioSelector处理读写事件,写事件处理时,将消息发送出去,更新batch的produceFuture让accumulator感知到消息发送结果
  3. 以下详细讲讲Sender的流程

2.Sender

Sender的主要流程

2.1 acks

acks是用来描述msg发送要怎样才能确认发送成功。
“-1”:全部副本应答,默认值
“0”:不需要任何应答,这种情况发送完立马认为发送成功
“1”:leader副本应该即认为发送成功

2.2 client

接口是KafkaClient,实现类是NetWorkClient

  1. send:
记录当前发送中的request=》inFlightRequests,
调用Selector进行消息发送
  1. poll:
调用Selector进行写事件处理:发送消息
清理一些数据:处理inFlightRequests
执行回调:handleProduceResponse:producerBatch.complete=》会更新batch里的produceFuture

inFlightBatches

记录当前当前正在被发送的batch

Map<TopicPartition, List<ProducerBatch>> inFlightBatches;

可以看到该Map的value是list类型,保证了同一个partition中的batch数据有序性

3. Selector

其实Selector的作用上面已经描述了,就是基于partition的node找到对应的channel,执行写事件注册和真实的消息发送

3.1 nioSelector

这个应该不用详细讲了,学过NIO的同学都知道,java的NIO Selector可以进行读写事件处理,就是通过selector的select方法,找到可处理的keys,然后基于不同的keys,拿到对应的channel,往channel写数据或者从channel读数据

3.2 channels

该channel是Kafka对java的channel进行的封装,得到的KafkaChannel,其实能够实现的功能就是暂存下可发送消息,以及调用java的channel 发送数据。此处是保存partition node和channel的映射关系。

4. 全局总览

Kafka Producer全局总览图


总结

Kafka的消息发送其实就是一个RPC的过程,有自己的网络协议、消息协议、消息序列化方式、数据批量发送(增加吞吐量)、超时处理、底层网络模型。
不过Producer对于batch的复用,其实还是有一定的厉害之处的,等下次有空分析下~

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

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

相关文章

【hot100-java】N 皇后

回溯篇 视频题解 真的裂开了&#xff0c;多看视频题解。 class Solution {public List<List<String>> solveNQueens(int n) {List<List<String>>retnew ArrayList<>();int []colnew int[n];boolean[] onPathnew boolean[n];boolean[] diag1ne…

(Linux和数据库)1.Linux操作系统和常用命令

了解Linux操作系统介绍 除了办公和玩游戏之外不用Linux&#xff0c;其他地方都要使用Linux&#xff08;it相关&#xff09; iOS的本质是unix&#xff08;unix是付费版本的操作系统&#xff09; unix和Linux之间很相似 Linux文件系统和目录 bin目录--放工具使用的 操作Linux远程…

双光吊舱图像采集详解!

一、图像采集 可见光图像采集&#xff1a; 使用高性能的可见光相机&#xff0c;通过镜头捕捉自然光或人工光源照射下的目标图像。 相机内部通常配备有先进的图像传感器&#xff0c;如CMOS或CCD&#xff0c;用于将光信号转换为电信号。 红外图像采集&#xff1a; 利用红外热…

【hot100-java】二叉树的最近公共祖先

二叉树篇 我觉得是比两个节点的深度&#xff0c;取min&#xff08;一种情况&#xff09; DFS解题。 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val x; }* }*/ clas…

Unity/VS 消除不想要的黄色警告

方法一&#xff1a;单个消除 在要关闭的代码前一行写上#pragma warning disable 警告代码编码 在要关闭代码行下面一行写上#pragma warning restore 警告代码编码 精准的关闭指定地方引起的代码警告&#xff0c;不会过滤掉无辜的代码 #pragma warning disable 0162,1634HandleL…

JDBC: 连接池

文章目录 没有连接池的现状连接池解决现状问题的原理连接池好处常用连接池的介绍Druid连接池DRUID简介Druid常用的配置参数Druid连接池基本使用API介绍 案例代码 没有连接池的现状 通过下图来分析一下我们目前jdbc程序的结构。 以前使用的jdbc的缺点&#xff1a; 1、操作数据库…

户外打气泵方案软件设计开发

随着户外活动的普及和人们对便捷生活的需求&#xff0c;打气泵成为越来越多有车人士及爱好户外运动的人的装备之一。而打气泵的核心控制是它的芯片和软件方案&#xff0c;今天我们就介绍一下打气泵芯片软件方案的开发过程与技术要点。 打气泵方案的软件设计相较于硬件更具复杂性…

数据库——sql多表查询

当要在两个表&#xff08;或多个表&#xff09;中查找对应数据时&#xff0c;与普通的查询略有不同。本篇博文用于介绍基本的多表查询的方法。 为方便展示&#xff0c;本篇建了两个数据库表“学生表”和“班级表”作为例子 其中&#xff0c;在“学生表”中&#xff0c;cid标签…

RT-DETR改进策略:BackBone改进|CAFormer在RT-DETR中的创新应用,显著提升目标检测性能

摘要 在目标检测领域,模型性能的提升一直是研究者和开发者们关注的重点。近期,我们尝试将CAFormer模块引入RT-DETR模型中,以替换其原有的主干网络,这一创新性的改进带来了显著的性能提升。 CAFormer,作为MetaFormer框架下的一个变体,结合了深度可分离卷积和普通自注意力…

SpringBoot教程(二十四) | SpringBoot实现分布式定时任务之Quartz(动态新增、修改等操作)

SpringBoot教程&#xff08;二十四&#xff09; | SpringBoot实现分布式定时任务之Quartz&#xff08;动态新增、修改等操作&#xff09; 前言数据库脚本创建需要被调度的方法创建相关实体类创建业务层接口创建业务层实现类控制层类测试结果 前言 我这边的SpringBoot的版本为2…

Android 防止截屏和录屏

通过给当前的window对象设置标记WindowManager.LayoutParams.FLAG_SECURE来防止截屏和录屏 protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 防止截屏getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManage…

vscode配置:启用括号对着色

想要的效果&#xff1a;启用括号对着色&#xff0c;在大括号之间用折线表示&#xff0c;看起来会更加直观方便&#xff0c;例如在less中嵌套层级比较多时&#xff0c;大括号的层级不容易看清楚&#xff0c;做了这个配置会更好一些。 vscode安装扩展插件&#xff1a;Bracket P…

Spring Boot学习资源库:Spring生态的精华

摘 要 社会的进步&#xff0c;教育行业发展迅速&#xff0c;人们对教育越来越重视&#xff0c;在当今网络普及的情况下&#xff0c;教学模式也开始逐渐网络化&#xff0c;各大高校开始网络教学模式。 本文研究的教学资源库系统基于Springboot框架&#xff0c;采用Java技术和MYS…

Linux deepin系统通过编辑crontab来设置定时任务---定时关机

在Linux系统中&#xff0c;crontab 是用来设置周期性被执行的指令的守护进程。通过编辑 crontab&#xff0c;您可以安排定时任务&#xff0c;比如定时关机、定时备份文件、定时运行脚本等。以下是如何编辑 crontab 来设置定时任务的步骤&#xff1a; 打开终端&#xff1a;您可以…

AcWing 802. 区间和(离散化算法,python)

本篇博客详细讲解一下离散化知识点&#xff0c;通过讲解和详细列题带大家掌握离散化。 题目&#xff1a; 原题链接&#xff1a;https://www.acwing.com/problem/content/description/804/ 假定有一个无限长的数轴&#xff0c;数轴上每个坐标上的数都是 0。 现在&#xff0c;…

平时使用的正则总结

1、将某一个字符串的后缀名后面加上“!400_500” 使用场景是将minio拿过来的图片压缩尺寸从而压缩其大小&#xff0c;加快渲染的速度。需要在图片的后缀名后面加上尺寸如下&#xff1a; const str //storage-test.test.shiqiao.com/gateway/common/isopen/2024/10/09/e708e9…

科创集团所属园区入驻企业北京铭镓半导体获 “硬科技”潜在独角兽企业认定

近日&#xff0c;科创集团所属工宇园区企业北京铭镓半导体荣获北京市科委、中关村管委会“硬科技”潜在独角兽企业认定。独角兽企业特指具备显著创新力、展现出强劲成长潜力以及获得市场高度认可的企业&#xff0c;是新经济领域发展的标志性存在。 北京铭镓半导体有限公司于202…

如何搭建直播美颜平台?视频美颜SDK的核心技术详解

时下&#xff0c;美颜效果作为提升直播吸引力的重要手段&#xff0c;已经成为主播和观众的共同期待。本篇文章&#xff0c;小编将与大家分享搭建一个高效的直播美颜平台的流程&#xff0c;重点介绍视频美颜SDK的核心技术。 一、直播美颜平台的构建 搭建一个直播美颜平台&#…

vue3:自定义描点定位组件(锚点定位和监听滚动切换)以及遇到的问题

目录 第一章 实现效果 第二章 锚点组件分析 2.1 功能分析 2.2 核心点 第三章 源代码 3.1 数据格式 3.2 代码分析 3.2.1 tab栏以及内容页面 3.2.2 逻辑 第四章 遇到的问题 第一章 实现效果 第二章 锚点组件分析 2.1 功能分析 tab栏以及切换涉及逻辑点击tab切换同时页…

uni-app 打包成app时 限制web-view大小

今天对接一个uni-app的app 内置对方h5 web-view的形式 需要对方在web-view顶部加点东西 对方打的app的web-view始终是全屏的状态&#xff0c;对方表示做不到我要的效果 emmmmmm。。。。。。 于是乎 自己搭了个demo 本地h5跑起来审查了下代码&#xff0c;发现web-view是给绝对定…