中间件核心技术与实战
丁威
中通快递资深架构师,RocketMQ 社区首席布道师
19674 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 33 讲
中间件核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册

加餐 | 中间件底层的通用设计理念

你好,我是丁威。
我们都知道,开发中间件的技术含量是比较高的,如果能参加中间件的开发,可以说是朝“技术大神”迈了一大步。
但是,中间件开发并不是遥不可及的。通过对各主流中间件的研究,我发现了中间件底层的一些通用设计理念,它们分别是数据结构、多线程编程 (并发编程)、网络编程 (NIO、Netty)、内存管理、文件编程和相关领域的知识。
其中,数据结构、多线程编程和网络编程是中间件的必备基础,在前面的课程中,我也做了详细介绍。这节课,我会重点介绍内存管理和文件编程相关的知识,带你了解开发中间件的核心要点。
你可能会问,六大技能,那最后一个技能是什么呢?最后这个技能就是相关领域的知识,它和中间件的类型有很大关系,和你需要解决的问题密切相连。
举个例子,数据库中间件的出现就是为了解决分库分表、读写分离等与数据库相关的问题。那如果要开发一款数据库中间件,你就必须对数据库有一个较为深入且体系化的理解。想要开发出一款 MyCat 这样基于代理模式的数据库,就必须了解 MySQL 的通信协议。我们甚至可以将相关领域的知识类比为我们要开发的业务系统的功能需求,这个是非常重要的。不过这部分我没有办法展开细讲,需要你自己去慢慢积累。我们还是说回内存管理。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了中间件开发中的关键技能和文件编程的重要性。首先,文章强调了内存管理对中间件开发的重要性,特别是对于Java的垃圾回收机制对中间件开发的影响。随后详细介绍了Netty采用的独立管理内存和对象池技术,以降低垃圾回收频率,提高性能和并发能力。接着,文章探讨了文件存储协议的设计要点,以及基于文件编程模型的索引设计和内存映射机制,并指出通过索引机制和内存映射机制,文件存储的性能得到了提升。最后,文章介绍了文件顺序写机制在数据库领域的应用,强调了在保证数据库不丢失的情况下提升性能的重要性。整体而言,本文对中间件开发中的内存管理技术特点进行了深入探讨,对于读者快速了解中间件开发中的关键技能和文件编程的重要性具有重要参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《中间件核心技术与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(8)

  • 最新
  • 精选
  • kobe
    大佬,我想问两个问题: 1.怎么能把自己感兴趣的一两个中间件了解的比较精通啊? 2.没有做中间件开发的经验,可以去面试基础架构/中间件开发相关的工作岗位吗?

    作者回复: 你好,关于你的第一问题,我在后面的内容会有专门一节课介绍如何深入研究一款中间件。 关于第二个问题,这个是没有问题的,一般要面试基础机构或者中间件开发,通常需要我们具备中间件的一些基础知识,就像我这个专栏中提到的数据结构、JUC并发、Netty网络,尤其是前两者,然后就可以尝试去找这方面的工作,相比之下,其实更注重对JUC并发编程的理解。 掌握好这些基础知识后,可以挑一款主流的中间件研读一下,强烈建议研究一下RocketMQ,不仅掌握消息中间件相关的知识,更是里面蕴含了高并发编程的很多实用技巧。 如果想往基础架构或者中间件开发工作,可以找我细聊,希望能给你带来更多帮助。

    2022-07-01
    3
  • 雨落~紫竹
    所有的高性能 总结3类方法 就是 异步 缓存 分布式 mq 的设计 基本也类似 尤其是和kafka对比 基本都类似

    作者回复: 对头,关于RocketMQ与Kafka的高性能设计对比,在本专栏的后续还会专门提到,两者在实现上还是有一些差别的,敬请期待。

    2022-07-04
    1
  • William Ning
    管理块中的内存的图,没看明白,还需要再看下,消化下~~
    2022-07-13
    1
  • Geek_fb975d
    这里,我们还是从根节点开始遍历,当遍历到第一个左节点时,其存储的值为 2,并且它的左节点存储 3,右节点为 2,因为这一次我们需要申请 2 页内存,左节点存储的值为 3,能分配到的内存为 2 的 (maxOrder[3]-order[3]),最终得出为 1,即左节点只能分配 1 页的大小,故最终会定位它到右节点。从而将其右节点设置为 (maxOrder+1),表示已分配,然后依次遍历父节点,其值加 1。如果想要申请更多内存的话,重复上述步骤即可。 这个(maxOrder[3]-order[3])咋算的了
    2023-05-04归属地:陕西
  • Ray
    这水平也是尴尬的
    2023-04-01归属地:上海
  • kylexy_0817
    “一个节点在数组中存储的值为 n”,这里的n是指节点所在树的深度,还是存储容量的大小,抑或是内存的起始结束段?这里开始就没太看懂了。
    2022-12-11归属地:广东
  • Geek_87522c
    关于Netty内存分配的那段,我有点疑问。 假如第二次仍然申请一页,则会遍历到9号节点。此时9号节点的父节点是4号节点,array[4] += 1,这是没有问题的。但是就不应该继续往上遍历4号节点的父节点并对array自增1了。因为往上的节点,可分配的最大内存数已经不受影响了(因为之前都是左子树的内存被分配,array成员已经增过1了)。 个人觉得,当一个节点被分配出去之后,除了应该对其父节点对应的array成员自增1之外,还应该做个检查: 如果本节点的父节点的另一个子节点(也就是本节点的兄弟节点)或其子节点没有被分配出去,那么说明本节点的分配,影响了父节点的父节点的最大一次性可分配页数,此时需要继续递归父节点,其对应的array成员自增1。 反之,说明本节点的分配,不影响父节点的父节点的最大可分配数,递归终止。 换言之,不是所有的内存节点被分配时,都要遍历父节点并将其对应的array成员自增1,而是要看是否真的对父节点的可分配数有影响。 不知道我的理解是否有问题?
    2022-12-08归属地:美国
  • open!?
    存的是层数+左右节点已分配的?
    2022-11-24归属地:浙江
收起评论
显示
设置
留言
8
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部