2024年Java最全RocketMQ高手之路系列之十一:RocketMQ如何实现高性能读写(1),spring的设计模式面试题

总结

面试建议是,一定要自信,敢于表达,面试的时候我们对知识的掌握有时候很难面面俱到,把自己的思路说出来,而不是直接告诉面试官自己不懂,这也是可以加分的。

以上就是蚂蚁技术四面和HR面试题目,以下最新总结的最全,范围包含最全MySQL、Spring、Redis、JVM等最全面试题和答案,仅用于参考

一份还热乎的蚂蚁金服面经(已拿Offer)面试流程4轮技术面+1轮HR

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

在这里插入图片描述

从上图可知,一个看似简单的读数据、写数据的常规操作总共经历了以下的过程:

1、用户程序通过read()方法(实际会转化为CPU指令)向系统发起系统调用,此时系统上下文从用户态切换为内核态;

2、从硬盘中拷贝数据到内核态中的读缓冲区;

3、CPU通过调度把内核态读缓冲区的文件数据拷贝到用户态的用户缓冲区中,同时系统上下文切换为用户态;

4、经过逻辑处理后,用户程序需要将处理后的数据通过write()方法进行系统调用,此时系统上下文切换为内核态;

5、CPU通过调度将用户缓冲区的数据拷贝到socket缓冲区中;

6、将socket缓冲区中的数据拷贝至网卡io,系统上下文切换为用户态。

内核主要的作用总结起来就是对硬件来说进行统一对硬件管理,对上层应用来说提供统一对系统调用。由于硬件资源很敏感需要被保护起来,那么内核就起到了用户程序与硬件交互的桥梁作用。通过区分内核空间和用户空间的设计,隔离了操作系统代码与应用程序代码。

通过以上的分析我们可以看出来,传统的IO交互不仅有用户态内核态的多次切换,同时数据也是来回的复制,极其的繁琐以及耗费资源。

RocketMQ高性能读写的秘密


上文我们已经分析过传统的IO交互模型中涉及多次的用户态与内核态的切换以及多次的数据复制,交互性能不高,在大量文件读写的场景下这种交互方式必定会成为消息中间件的性能瓶颈。因此如果需要克服传统文件IO的缺点,必定要从减少数据复制等方面进行入手。那么RocketMQ到底是通过什么手段来操作的呢?

RocketMQ实现高性能读写,最主要的是其Broker针对持久化文件CommitLog以及ConsumerQueue进行高性能读写操作的。所谓的高性能实际是利用了mmap技术以及操作系统的PageCache来实现的,下面我们来具体分析下。

PageCache是操作系统对于文件的缓存机制,主要用于加速文件的读写,提升文件读写效率。PageCache其实是操作系统的一部分的内存,如果一次读取文件时出现未命中PageCache的情况,操作系统会从物理磁盘上访问加载读取新的文件的同时,会顺序对其他相邻块的数据文件进行预读取。这样只要下次访问的文件已经被加载至PageCache时,读取操作的速度基本等于访问内存,所以其访问性能很高。

mmap技术又是一个什么鬼呢?mmap 把磁盘文件直接映射到用户空间里的虚拟内存,这样就省去了从内核缓冲区复制到用户空间的过程,文件中的位置在虚拟内存中有了对应的地址,可以像操作内存一样操作这个文件,相当于已经把整个文件放入内存,但在真正使用到这些数据前却不会消耗物理内存,也不会有读写磁盘的操作。实现文件物理地址和进程虚拟地址的一一映射关系。RocketMQ主要通过JDK NIO包下的MappedByteBuffer.map()函数来进行映射实现。

在这里插入图片描述

以上分析可知,mmap通过映射技术直接将磁盘文件映射到用户空间的内存中去,这样就减少了内核态到用户态的数据复制,提升了数据处理的效率。

1、数据写入

Broker进行数据写入的时候,举个例子,⽐如Broker要写⼊消息到CommitLog⽂件中,Broker首先将⼀个CommitLog⽂件通过MappedByteBuffermap()函数映射其地址到操作系统的虚拟内存地址中。接着就可以对这个MappedByteBuffer执⾏写⼊操作了,写⼊的时候他会直接进⼊PageCache中。然后过⼀段时间之后,由操作系统的线程异步刷⼊磁盘中,如下图所示。因此数据写入的时候是和内存进行交互的,因此数据写入效率非常高。

在这里插入图片描述

2、数据读取

RocketMQ在进行数据读取的时候,首先从PageCache中进行数据获取。如果此时PageCache中有需要的数据则直接进行进行读取。如果PageCache中没有需要的数据,那么需要将磁盘中的文件拷贝到PageCache中。另外需要注意的是加载数据的时候,如CommtLog文件都是进行顺序写入的,会将相邻的数据一同进行加载,提升数据读取的效率。

在这里插入图片描述

总结

虽然面试套路众多,但对于技术面试来说,主要还是考察一个人的技术能力和沟通能力。不同类型的面试官根据自身的理解问的问题也不尽相同,没有规律可循。

上面提到的关于这些JAVA基础、三大框架、项目经验、并发编程、JVM及调优、网络、设计模式、spring+mybatis源码解读、Mysql调优、分布式监控、消息队列、分布式存储等等面试题笔记及资料

有些面试官喜欢问自己擅长的问题,比如在实际编程中遇到的或者他自己一直在琢磨的这方面的问题,还有些面试官,尤其是大厂的比如 BAT 的面试官喜欢问面试者认为自己擅长的,然后通过提问的方式深挖细节,刨根到底。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

/bbs.csdn.net/topics/618154847)收录**

需要这份系统化的资料的朋友,可以点击这里获取

  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值