day-3

BufferPool
  • 产生原因:ByteBuffer的创建和释放都是比较耗费资源的,为了实现内存的高效利用,产生了他。他会对特定大小的ByteBuffer进行管理
BufferPool的字段
  • free:是一个ArrayDeque队列,缓存指定大小的ByteBuffer对象
  • ReentrantLock:因为这个BufferPool在多线程中使用,保证其安全
  • waiters:这个队列中包含小空间导致阻塞的线程对应的Condition对象
  • totalMemory:整个pool的大小
  • availableMemory:可用空间大小-totalMemeoy-free中每个ByteBuffer大小
BufferPool的函数
  • allocate():从pool中申请ByteBuffer,要是因为空间不足申请不下来的时候,就阻塞调用线程
  • deallocate:从pool中释放大小为poolableSize[他是pool队列里面所有ByteBuffer的大小],然后唤醒一个因空间不足而阻塞的线程
RecordAccumulator
RecordAccumulator字段
  • batches:类型CopyOnWriteMap,TopicPartition-RecordBatch集合,他是一个队列,每个队员里面都可以找到RecordBatch集合要发送到的目的地TopicPartition
  • BatchSize:指定每个RecordBatch底层的ByteBuffer大小
  • Compression:压缩类型
  • imcomplete:未发送完成的RecordBatch集合
  • free:BufferPool对象
  • drainIndex:发送RecordBatch集合一次发不完,他记录的就是下次开始发送的位置
kafkaProducer.send()调用的时候,最终内部调用的是RecordAcculator.append()
RecordAcculator.append()详细步骤
  • 在batch中找TopicPartition对应的RecordBatch集合,要是没有,就创建,并将他添加到batches
  • 对Deque加锁(Deque就是RecordBatch集合)
  • 调用tryAppend(),想Deque最后一个RecordBatch追加Record(消息)
  • 对Deque解锁
  • 要是成功:返回RecordAppendResult[内部封装了ProduceRequestRequest]唤醒sender;
  • 追加失败:从BufferPool中申请新的ByteBuffer,回到给Deque加锁继续直到追加成功,要是还是失败,就用ByteBuffer创建RecordBatch, 将Record追加到新建的RecordBatch,将RecordBatch追加打破Deque最后将新建的RecordBatch追加到incomplete集合,然后解锁,返回并唤醒sender;
    ####### 当然,这里唤醒sender也不是说唤醒就能唤醒的,他是调用了kafkaProducer.dosend()函数判断此次向RecordAccumlator中追加消息是否满足消息所在的最后一个RecordBatch满了,或者队列中不指一个RecordBatch
Ready()[在客户端向服务器发送消息前,会调用它来获取符合发送的消息集合的节点],有如下条件
  • Deque中有多个RecordBatch或者第一个RecordBatch是否满了【只取第一个进行判断就行】
  • 是否超时了
  • 是否BufferPool的空间耗尽了
  • 是否有线程在等待flush操作完成
  • sender线程准备关闭
他的过程如下:首先他会遍历batches集合的每分区,找到分区leader所在的node,要是满足上面的条件就加到readyNodes集合中;过程完后最后函数返回ReadyCheckResult对象,他里面记录了满足的node集合,还有直到步道leader的分区,还有下次调用ready()进行检查的时间间隔
kafkaProducer.send()调用的时候,最终内部调用的是RecordAcculator.append(),接着调用RecordAccumulator.drain()
RecordAccumulator.drain()会将之前的map(TopicPartition,list)构造成map(NodeID,List)返回
  • 为什么要这样做呢?—原因:在I/O层,生产者是面向Node发送消息的,但是在sender呢,他是关心消息发送到哪个分区的,因此要进行转换
  • 今天也是美好的一天* o*

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

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

相关文章

java 验证ip是否可达

默认IP的设备已开放ping功能 代码 public class PingTest {public static void main(String[] args) throws Exception {String ip "192.168.21.101";boolean reachable InetAddress.getByName(ip).isReachable(3000);System.out.println(ip (reachable ? &quo…

LeetCode 2187.完成旅途的最少时间

题目: 给你一个数组 time ,其中 time[i] 表示第 i 辆公交车完成 一趟旅途 所需要花费的时间。 每辆公交车可以 连续 完成多趟旅途,也就是说,一辆公交车当前旅途完成后,可以 立马开始 下一趟旅途。每辆公交车 独立 运…

永磁同步电机无速度算法--基于正切函数锁相环的滑模观测器

最近在学习锁相环,后续会记录一下了解到的几种PLL。 一、原理介绍 传统锁相环控制框图如下所示 在电机正转时,传统锁相环可以实现很好的转速和转子位置估计,但是当电机反转,反电动势符号发生变化,系统估计转子位置最…

Vim-vimrc 快捷键映射

Vim-vimrc 快捷键映射 文章目录 Vim-vimrc 快捷键映射Leader 键快捷键映射:插入特定字符插入 --插入 ##插入 解释Leader键设置快速插入分隔线 Leader 键 我们还将 , 设置为 Leader 键,使得其他快捷键映射更加简洁。 let mapleader ","快捷键…

SylixOS armv7 任务切换

SylixOS 操作系统下,任务切换可以分为两种 中断退出时,执行的任务切换(_ScheduleInt)内核退出时,执行的任务切换(_Schedule) 下面分别讲讲这两种任务切换 1、中断退出时任务切换 关于 ARM 架…

Java 自定义异常:如何优雅地处理程序中的“业务病”?

🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、从一个真实场景开始:银行转账系统的困境 假设你正在开发一个银行转账系统,当用户尝试转账时可能出现以下问题: 转…

【JAVA】【Stream流】

1. filter操作 filter()方法用于根据给定的条件过滤列表中的元素&#xff0c;仅保留满足条件的项。 List<Integer> list Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);List<Integer> res list.stream().filter(a -> a % 2 0).collect(Collectors.toList());for(I…

四、Redis实现限流

简介&#xff1a; 限流算法在分布式领域是一个经常被提起的话题&#xff0c;当系统的处理能力有限时&#xff0c;如何阻止计划外的请求继续对系统施压。 系统要限定用户的某个行为在指定的时间里只能允许发生 N 次&#xff0c;如何使用 Redis 的数据结构来实现这个限流的功能&a…

基于Geotools的两条道路相交并根据交点形成新路线实战-以OSM数据为例

目录 前言 一、需求场景及分解 1、需求场景 2、需求应用 二、需求实现 1、加载路网数据 2、获取道路信息 3、相交点求解 4、生成新道路 5、结果可视化 三、总结 前言 在当今数字化迅速发展的时代&#xff0c;地理空间数据的处理与分析已成为众多领域不可或缺的关键技…

goland有基础速通(需要其它编程语言基础)

tip: 无论是变量、方法还是struct的访问权限控制都是通过命名控制的&#xff0c;命名的首字母是大写就相当于java中的public&#xff0c;小写的话就是private&#xff0c;&#xff08;private只有本包可以访问&#xff09; 1 go的变量声明 普通变量 特点&#xff1a; 变量类…

量化面试绿皮书:19. 相关系数

文中内容仅限技术学习与代码实践参考&#xff0c;市场存在不确定性&#xff0c;技术分析需谨慎验证&#xff0c;不构成任何投资建议。 19. 相关系数 假设有三个随机变量x、y和z。 x与y之间的相关系数为0.8&#xff0c;x与z之间的相关系数也是0.8。 Q: 那么y与z之间的最大相关…

新生活的开启:从 Trae AI 离开后的三个月

很久没有写文章了&#xff0c;想借着入职新公司一个月的机会&#xff0c;和大家唠唠嗑。 离职 今年2月份我从字节离职了&#xff0c;结束了四年的经历&#xff0c;当时离开的核心原因是觉得加班时间太长了&#xff0c;平均每天都要工作15&#xff0c;16个小时&#xff0c;周末…

LLM部署之vllm vs deepspeed

部署大语言模型(如 Qwen/LLaMA 等)时,vLLM 与 DeepSpeed 是当前主流的两种高性能推理引擎。它们各自专注于不同方向,部署流程也有明显区别。 vLLM 提供极致吞吐、低延迟的推理服务,适用于在线部署;DeepSpeed 更侧重训练与推理混合优化,支持模型并行,适用于推理 + 微调/…

Git(二):基本操作

文章目录 Git(二)&#xff1a;基本操作添加文件修改文件版本回退撤销修改情况一&#xff1a;工作区的代码还没有 add情况⼆&#xff1a;已经 add 但没有 commit情况三&#xff1a;已经 add 并且也 commit 删除文件 Git(二)&#xff1a;基本操作 添加文件 首先我们先来学习一个…

nginx + ffmpeg 实现 rtsp视频实时播放和历史播放

nginx和ffmpeg 的安装请参考我的另一篇文章 Nginxrtmpffmpeg搭建视频转码服务_nginx-rtmp-module-master-CSDN博客 目录 1、整体方案设计如图 2、nginx下目录创建和配置文件创建 3、创建视频流生成脚本 4、修改nginx配置 5、管理界面 (video.html) 6、ffmpeg后台启动 …

全国产!瑞芯微 RK3576 ARM 八核 2.2GHz 工业核心板—硬件说明书

前 言 本文为创龙科技 SOM-TL3576 工业核心板硬件说明书,主要提供 SOM-TL3576 工业 核心板的产品功能特点、技术参数、引脚定义等内容,以及为用户提供相关电路设计指导。 为便于阅读,下表对文档出现的部分术语进行解释;对于广泛认同释义的术语,在此不做注释。 硬件参考…

web3 浏览器注入 (如 MetaMask)

以下是关于 浏览器注入方式(如 MetaMask) 的完整详解,包括原理、使用方法、安全注意事项及常见问题解决方案: 1. 核心原理 当用户安装 MetaMask 等以太坊钱包扩展时,钱包会向浏览器的 window 对象注入一个全局变量 window.ethereum,这个对象遵循 EIP-1193 标准,提供与区…

解密提示词工程师:AI 时代的新兴职业

大家好!在人工智能飞速发展的当下&#xff0c;有一个新兴职业正悄然崛起——提示词工程师。他们虽不如数据科学家般广为人知&#xff0c;却在 AI 应用领域发挥着独特且关键的作用。 何为提示词工程师&#xff1f; 提示词工程师专注于设计和优化与 AI 模型进行交互的提示词&…

linux 下 jenkins 构建 uniapp node-sass 报错

背景: jenkins 中构建 uniapp 应用 配置: 1. 将windows HbuilderX 插件目录下的 uniapp-cli 文件夹复制到 服务器 /var/jenkins_home/uniapp-cli 2. jenkins 构建步骤增加 执行 shell ,内容如下 echo ">> 构建中..."# 打包前端 export LANGen_US.UTF-8…

QT常见问题(1)

QT常见问题&#xff08;1&#xff09; 1.问题描述 Qt在编译器中直接运行没有任何问题&#xff0c;但是进入exe生成目录直接双击运行就报错&#xff1a;文件无法定位程序输入点_zn10qarraydata10deallocateepsyy于动态链接库。 2.问题原因 这个错误通常是由于程序运行时找不…