读kafka生产端源码,窥kafka设计之道(下)

news2024/11/26 19:26:05

背景

在上一篇文章《读kafka生产端源码,窥kafka设计之道(上)》 留下了kafka设计上比较优秀的一个点;内存的循环使用。本篇文章准备盘盘它。

好奇

为什么 kafka减少发送消息时向JVM频繁申请内存,就可以降低JVM GC的执行次数?

我们知道网络上传输的都是二进制数据;而在java中想通过socke网络套接字接口发送数据,底层都是用的ByteBuffer。在往网络上发送数据前,先申请块ByteBuffer的内存;然后把数据写入到此ByteBuffer内存中;调用底层socket的write接口,就OK了;大概伪代码流程

   //伪代码
   //申请内存
   ByteBuffer buffer = ByteBuffer.allocate(size)
   //内存里加入数据
   buffer.put(XXX)
   //发送数据
   SocketChannel.write(ByteBuffer src)

ByteBuffer占用的内存,什么时候会被回收了?

答:在jvm进行GC时会被回收;

试想如果上面那段代码执行非常频繁,创建ByteBuffer就会很频繁;创建ByteBuffer很频繁,那么申请内存就会很频繁,申请内存越频繁,内存被占满的时间也就会越来越短,内存满了就只能靠不停的GC进行内存的回收,加以重复使用了。而现代JVM里GC的发展目标之一,就是减少GC的停顿时间。GC优化大师从PS,CMS,G1,到ZGC,都在朝这这个方向在努力。

kafka如何解决这个内存频繁申请和GC 频繁释放的问题了?

如果可以用一句简单的话来总结:那么我想应该是 对ByteBuffer的重复使用。 是的用完了不要丢,也不让jvm 给GC了。 即对进行了网络发送的ByteBuffer进行复用;如果有新的消息要发送,可以从缓存池里获取已有 ByteBuffer;然后往里面写入消息数据;当IO线程把ByteBuffer里的消息发往broker并收到对应的响应后,会把ByteBuffer放回缓存池供下一次需要发送的消息循环使用。
大概流程如下图:
  
1690200082886.png

核心参数和代码

有两个核心参数,可以控制缓存池BufferPool的行为

  • buffer.memory
        缓存池大小,默认32M。如果IO thread发送消息的速率比业务线程生产消息的速度,则会引起业务线程的阻塞,可根据实际情况和jvm大小增大此参数

  • batch.size
        控制每个缓存块ByteBuffer的大小,默认为16K。即一个 BatchRecord里可存的多条消息最大空间

  • ByteBuffer的申请
        
    1690200135293.png

  • ByteBuffer的回收
        
    1690200224143.png

总结

如果要编写一款网络应用程序,或者网络框架的工具,我希望能向kafka一样,能考虑到内存的复用;并且减少对上层应用的影响。  
假设一个应用通过kafka发送50个G的网络数据;那么kafka的缓存池,就节约了10个G内存的申请和回收;由此减少了多少次GC和GC暂停时间了。那么假设有个50个这样的应用了?总的收益又是多少了?  
不是所有的工具都能号称是为应对大数据场景而产生的;kafka做为一款中间件,能比较好的融入大数据生态,kafka的研发人员有自己的独特设计和考虑在支撑这它。

原创不易,请 点赞,关注,留言,转载 4暴击^^

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

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

相关文章

idea 设置了 vm options后无法启动

今天想扩展ideaj的JVM 设置了 vm options后无法启动 找了很久,重新卸载后安装也没有用 后面直接打开idea的bat文件 找到自己idea使用的.vmoptions文件,我是因为之前idea有缓存,一直用的我修改的文件,后面删了就可以启动了

看了我项目中的商品功能设计,同事也开始悄悄模仿了...

商品功能作为电商系统的核心功能,它的设计可谓是非常重要的。就算不是电商系统中,只要是涉及到需要交易物品的项目,商品功能都具有很好的参考价值。今天就以mall项目中的商品功能为例,来聊聊商品功能的设计与实现。 mall项目简介 …

前端实习第一周周记

第一天 第一天来的时候,十点左右就开始跑代码了,公司发了电脑,但由于自己的电脑环境比较齐全,所以就先用自己的电脑跑的代码。 一共是两个项目,一个pc类似于管理系统,还有一个是微信小程序。 拉代码的过…

3DVR全景旅游,最新数字化智慧文旅

导语: 随着科技的飞速发展,3DVR全景旅游正以其独特的特点和无限的优势,成为当今智慧文旅的领航者。穿戴上VR设备,只需一个轻轻的点击,你将被带入一个全新的数字世界,领略美景、探索奇迹。让我们一起深入了…

el-Cascader 中div上绑定keyDown事件

keydown,keyup,keypress 事件默认是给页面上可以聚焦的元素绑定键盘事件,例如input输入框,点击输入框即代表聚焦在该元素上。那么想要给div或者其他不能聚焦的元素上使用键盘事件怎么处理呢?这里用到tabindex属性。 …

Idea maven窗口 展示不分级 maven层级混乱

1. 正在写分布式im 开源项目:nami-im: 分布式im, 集群 zookeeper netty kafka nacos rpc主要为gate(长连接服务) logic (业务) lsb (负载均衡)store(存储) - Gitee.com …

redis - 学习笔记

一、NOSQL 1、概述 泛指非关系型数据库 关系型数据库:表格、行、列 2、特点 方便拓展大数据量,高性能(1s写8w次,读取11w,NOSQL的缓存记录级,是一种细粒度的缓存,性能比较高)数据…

网安第二天笔记

ssh 22端口 账号密码登陆、证书登录 smtp 25端口 邮件协议 DNS 53 DHCP 67 68端口 四个包 1.DHCP服务器:服务器管理IP地址池和配置参数 2.客户端请求:发送DHCP广播请求,discover消息 3.DHCP服务器回应:收到discover会回复offer…

Vue2.x和Vue3.x面试常问知识点-面试题

SPA单页面的理解,它的优缺点分别是什么? 是什么 SPA( single page application )仅在 Web 页面初始化时加载相应的 HTML、JavaScript 和 CSS。 一旦页面加载完成,SPA 不会因为用户的操作而进行页面的重新加载或跳转 而…

数据结构与算法——链栈及基本操作(包含入栈和出栈)详解

链栈,即用链表实现栈存储结构。 链栈的实现思路同顺序栈类似,顺序栈是将数顺序表(数组)的一端作为栈底,另一端为栈顶;链栈也如此,通常我们将链表的头部作为栈顶,尾部作为栈底&#…

C语言程序设计——文件操作

一、文件的打开和关闭 1. 文件指针 每个被使用的文件,都会在内存中开辟一个相应的文件信息区,用来存储文件的相关信息(文件名、文件状态、文件位置……)。 这些信息是保存在一个结构体变量中,该结构体类似是由系统声明…

选择优秀的敏捷项目管理工具:指南与考虑因素!

如何选择优秀的敏捷项目管理工具?敏捷项目管理工具是用于管理和执行敏捷项目的任何工具。在最基本的形式中,白板和便签可以被认为是敏捷管理工具。敏捷工具和其他项目管理工具之间的主要区别在于它们处理敏捷框架的能力,例如看板和Scrum。 换句话说&…

OpenAI推动人工智能治理向前发展

OpenAI和其他领先的人工智能实验室正在做出一系列自愿承诺,以加强人工智能技术和我们的服务的安全性、安全性和可信度。这个过程由白宫协调,是在美国和世界各地推进有意义和有效的人工智能治理的重要一步。 作为我们建立安全和有益的AGI的使命的一部分&a…

符合国内企业国产化需求的进销存系统

编者按:随着国内企业的数字化转型以及国产信创的要求,企业在选择软件系统的时候更加关注国产化这方面的是否能够被满足,信创需求的被满足,意味着可适用的范围更加宽泛,对企业来说,是一个花小成本有大收益的…

【简单图论】CF1833 E

Problem - E - Codeforces 题意&#xff1a; 思路&#xff1a; 显然&#xff0c;最大值就是什么边都不连的连通块个数&#xff0c;最小值就是能连的都连上 那就是&#xff0c;如果一个连通块存在度为1的点&#xff0c;就把它当作接口连接 Code&#xff1a; #include <b…

23.动态加载

动态加载 html部分 <div class"loading"> </div>css部分 *{margin: 0;padding: 0; } body{background-color: #2c3e50;display: flex;align-items: center;justify-content: center;height: 100vh;overflow: hidden; } .loading{position: relative;w…

Simulink仿真模块 - Mux

Mux:将相同数据类型和复/实性的输入信号合并为虚拟向量 在仿真库中的位置为:Simulink / Commonly Used Blocks Simulink / Signal Routing HDL Coder / Commonly Used Blocks HDL Coder / Signal Routing 模型为: 说明 Mux 模块将具有相同数据类型和复/实性的输入合并为一个向…

高精度地图服务引擎项目

技术栈&#xff1a;使用vue3TypeScriptElement PlusPiniaaxios 项目描述&#xff1a;高精度地图服务引擎项目&#xff0c;提供轻量化处理3D瓦片切片分布式处理分发服务的一站式解决方案 工作内容&#xff1a;1、项目60%已上的页面开发 2、部分模块的功能实现&#xff0c; 3、封…

网络安全进阶学习第七课——文件包含漏洞

文章目录 一、文件包含概念二、文件包含漏洞原理三、文件包含分类文件包含分为两种&#xff1a; 四、与文件包含相关的配置文件&#xff1a;&#xff08;php.ini文件&#xff09;五、与文件包含有关的函数1、include()2、include_once()3、require()4、require_once() 六、文件…

深兰科技大模型入围2023年数字经济应用场景“揭榜挂帅” 项目名单

7月17日&#xff0c;武汉市2023年数字经济应用场景“揭榜挂帅”拟揭榜项目名单&#xff0c;正式揭晓公示。 在经专家评审、项目路演、现场核查等层层遴选之后&#xff0c;由深兰科技武汉研发中心、深兰科技(上海)有限公司联合武汉碧水产业发展有限公司、武汉江汉路步行街投资发…