首页 > 编程语言 >读kafka生产端源码,窥kafka设计之道(下)

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

时间:2023-08-28 14:31:54浏览次数:48  
标签:频繁 缓存 kafka 之道 源码 GC 内存 ByteBuffer

背景

在上一篇文章《读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放回缓存池供下一次需要发送的消息循环使用。 大概流程如下图:

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

核心参数和代码

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

  • buffer.memory 缓存池大小,默认32M。如果IO thread发送消息的速率比业务线程生产消息的速度,则会引起业务线程的阻塞,可根据实际情况和jvm大小增大此参数
  • batch.size 控制每个缓存块ByteBuffer的大小,默认为16K。即一个 BatchRecord里可存的多条消息最大空间
  • ByteBuffer的申请

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

  • ByteBuffer的回收

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

总结

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

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

标签:频繁,缓存,kafka,之道,源码,GC,内存,ByteBuffer
From: https://blog.51cto.com/u_16205794/7263616

相关文章

  • 直播商城源码,android xml中设置水平虚线及竖直虚线
    直播商城源码,androidxml中设置水平虚线及竖直虚线水平虚线:line_stroke <?xmlversion="1.0"encoding="utf-8"?><shapexmlns:android="http://schemas.android.com/apk/res/android"  android:shape="line">  <stroke    and......
  • SpringBoot整合kafka配置多个kafka配置
     SpringBoot整合kafka的简单应用及配置说明(包含账号密码配置)、Kerberos证书连接方式:https://www.cnblogs.com/pxblog/p/14821853.html 依赖<dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactI......
  • 《代码整洁之道》第 10 章 类
    第10章类10.1类的组织遵循标准的Java约定,类应该从一组变量列表开始。如果有公共静态常量,应该先出现。然后是私有静态变量,以及私有实体变量。很少会有公共变量。公共函数应跟在变量列表之后。我们喜欢把由某个公共函数调用的私有工具函数紧随在该公共函数后面。这符合了......
  • 成品直播源码推荐,android自定义显示图片+文字
    成品直播源码推荐,android自定义显示图片+文字 /** *@authorMartin-harry *@date2021/8/10 *@address *@Desc自定义toast */publicclassToastUtil{  /**   *显示文本+图片   *@paramcontext   *@parammessage   */  publicsta......
  • java.lang.OutOfMemoryError: Java heap space 解决之道
    使用Java程序从数据库中查询大量的数据时出现异常:java.lang.OutOfMemoryError:Javaheapspace在JVM中如果98%的时间是用于GC且可用的Heapsize不足2%的时候将抛出此异常信息。JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM......
  • 红黑树的知识点以及源码
    花了几个小时看了B站大佬刘冬煜讲解红黑树源码和性质,对红黑树知识有了一个很清晰的理解。满满的成就感,把大佬有关红黑树的资料借用了一下,做了一点简单的修改。红黑树具有如下的性质:1.红黑树是一颗平衡二叉搜索树,其中序遍历单调不减。2.节点是红色或者黑色。3.根节点是黑色。......
  • 基于Java的小说阅读系统-计算机毕业设计源码+LW文档
    毕业设计(论文)的基本要求随着信息技术的发展,基于web模式的小说阅读系统逐渐普及,网上阅读是一种新型的阅读模式,其模式受到了人们的欢迎。要求:(1)学生能针对实际的小说阅读系统需求进行调研,并查阅相关资料撰写出开题报告。(2)在此基础上选用合适的开发平台与工具进行系统开发与调试。(3......
  • 企业员工心理健康管理系统-计算机毕业设计源码+LW文档
    摘 要 随着计算机信息技术的发展,各种管理系统逐渐用在社会生产生活中,通过系统化管理提高办事流程,节约时间。越来越多的人习惯并依赖于通过信息技术和智能化的形式来处理日常各类事物。为了满足健康求助者的需要,以及适应现代化健康信管理的需求,决定开发企业员工心理健康管理系......
  • 基于springboot的校园二手交易市场管理系统研究-计算机毕业设计源码+LW文档
    一、设计(论文)选题的依据(选题的目的和意义、该选题在国内外的研究现状及发展趋势,等)在国家倡导节能减排背景下,节俭消费理念已逐渐成为人们生活的主流观念。特别是在现阶段,国家发展仍是以经济建设为核心,所以在保障经济发展的前提下,对社会对环境保持友好的态度下,协调好人类与环境的共......
  • 基于ssm的智慧小区管理系统设计与实现-计算机毕业设计源码+LW文档
    摘 要随着目前信息化手段的进步,使用技术手段可以有效的对小区物业进行管理。在社区,人员多,各种维修、报修信息大,如果单靠人工进行管理,很难进行有效的统计。为此提出开发智慧小区管理系统,来管理小区的业主信息、通知公告、报修管理、房产管理等。本智慧小区管理系统可以降低社区工......