RocketMQ源码及高性能分析
本专栏主要分享了RocketMQ源码的解析,以及从底层IO来分析RocketMQ在高性能上的优化。
CallMeJiaGu
个人博客:https://www.callmejiagu.com/
展开
-
FileChannle 和 MMAP 高性能分析
前言上一篇的博客中,我从底层上分析了BufferInputStream为什么效率会比FileInputStream来得高,这两种方式都是传统的IO,在JDK1.4 中NIO又多了两种新的IO方式:FileChannle 和 MMAP。这里着重来解释FileChannle的高性能的场景。FileChannleFileChannel 存在于 java.nio 包中,属于 NIO 的一种,但是注...原创 2018-12-30 12:39:28 · 1658 阅读 · 1 评论 -
BufferedInputStream 底层原理解析
前言RMQ中为了实现高性能在IO上做了很多优化,在阿里中间件性能挑战赛也可以看到很多大神们在IO上花了很多功夫去分析优化,这篇主要来解析一下BufferedInputStream的实现原理,看看它在IO上做了哪些优化。误区看到很多文章是这么描述BufferedInputStream性能高的原因:BufferedInputStream 将数据先保存在了缓存区,从而减少磁盘IO操作次数,提高I...原创 2018-12-28 10:57:08 · 1225 阅读 · 2 评论 -
内存映射 mmap的理解(转载+整理)
前言上一篇解释了RMQ为了提高大文件的读写效率,使用了内存映射的方法,将磁盘上的文件与进程中的进程虚拟空间进行了映射,减少一次内核空间到用户空间的一次复制。看到这里我就有了疑惑,既然内存映射有这么好的特性,为什么还需要传统的IO呢?看下文的分析。进程中的虚拟内存mmap是将文件与进程虚拟空间进行了映射,所以你需要先明白进程虚拟空间是什么概念。下图的左边就是一个进程地址空间可视图。你可以...转载 2018-12-21 19:47:10 · 7419 阅读 · 1 评论 -
RocketMQ 源码分析 消息存储(预备知识二)(转载+整理)
前言在RMQ中为了提高commitlog文件的读写效率,而采用了一个叫做内存映射的技术。按照我的理解,内存映射在处理大文件上有非常大的性能提升,所以这篇来记录一下我对内存映射的理解。用户态和内核态我们都知道操作系统分为用户态和内核态,内核态表示当前为内核程序执行时的状态,用户态是用户程序代码运行的状态。用户态是不能直接和物理设备打交道的,如果想把硬盘的一块区域读到用户态,则需要两次拷贝(硬...转载 2018-12-21 09:31:04 · 405 阅读 · 1 评论 -
RocketMQ 源码分析 消息存储(预备知识一)
前言看到RocketMQ的性能问题的时候,通常能看到page cache、顺序IO写、预读等,要想设计出一个高性能的中间件,这部分的知识是绝对要掌握的。顺序IO读写为什么速度更快当需要从硬盘上读取一个文件时,首先会要求磁头定位到这个文件的起始扇区。这个定位过程包括两个步骤: 磁头定位到对应的磁道; 主轴马达带动盘片转动到正确的位置。这个过程所花费的时间被称为寻址时间。也就是说寻址时间实际...原创 2018-12-19 12:45:14 · 449 阅读 · 0 评论 -
读源码感
前言最近的时间差不多都围绕着RocketMQ的学习上,一开始从了解RocketMQ的场景到RocketMQ的一个使用,然后到源码的阅读。前面两个过程无需多说,到了读源码的阶段,我时常问自己,读这份源码的意义在于哪?感想我从namesrv的启动类入手开始阅读,作为切入点我觉得没错,但是时常因为某个细枝末节的事情从而打断对整块功能块的认识。这点我觉得是在读源码的一个误区吧,首先你想要掌握所有的...原创 2018-12-19 12:44:28 · 483 阅读 · 0 评论 -
RocketMQ 源码分析 BrokerStartUp(七)
前言broker是消息接收处理,消息落地的核心模块。这个模块用于接收producer发送的消息以及consumer消费的消息。 本章从broker的启动类入手分析一下broker启动的过程。分析broker是为了能够搞明白master和slave之间的关系,以及消息落地的具体过程。createBrokerControllerbroker启动会获取外部传入的初始化参数, 也会从配置文件中加...原创 2018-12-14 12:02:48 · 1094 阅读 · 0 评论 -
RocketMQ 源码分析 NettyRemotingServer(六)
前言已经写了几篇关于RocketMQ源码的分析,可能对其逻辑处理会多一点认识,但还没深入到RocketMQ精髓中。比如MQ中的通信是如何实现的、如何实现高性能,高可用、最终一致性、MQ 消息存储。这些才是我们阅读源码的一个目标。所以这篇通过分析源码的来了解一下RocketMQ通信机制。本文很大部分摘录了 匠心独运的博客。NettyRemotingServerRocketMQ中RPC通信的...原创 2018-12-14 12:01:36 · 1018 阅读 · 0 评论 -
RocketMQ 源码分析 BrokerHousekeepingService(五)
前言RocketMQ在早期版本使用的是Zookeeper,考虑到Zookeeper不够轻量,后面用namesrv来代替。熟悉Zookeeper的知道它使用心跳检测来判断服务是否正常,那么namesrv肯定也少不了这块功能,那么它是怎么判断一个Broker节点是否Live呢?如果一个Broker断开了namesrv是如何处理的呢?在前面篇章提到NamesrvController的构造函数中有一个...原创 2018-12-13 09:13:19 · 982 阅读 · 2 评论 -
RocketMQ 源码分析 RouteInfoManager(四)
前言在上一章分析了NamesrvController的构造函数时,会生成一个RouteInfoManager对象,该对象存放着整个消息集群的相关消息,所以这里单独拿出来分析。其实试想一下namesrv的功能不就是一个提供了通信功能的一个队列嘛,而RouteInfoManager保留了所有信息的路由。所以要想弄明白RocketMQ,RouteInfoManager必须要攻下。RouteInfo...原创 2018-12-12 09:40:05 · 1145 阅读 · 1 评论 -
RocketMQ 源码分析 NamesrvController(三)
前言上一篇在讲到createNamesrvController方法的时候,根据NamesrvConfig和NettyServerConfig对象生成了一个NamesrvController对象,当时并没有deep到该类中,所以这篇来记录一下NamesrvController构造函数的分析。NamesrvController类下面是NamesrvController的构造类,这里重点关注的是...原创 2018-12-11 09:34:38 · 592 阅读 · 0 评论 -
RocketMQ 源码分析 NamesrvStartup(二)
前言上一篇讲到使用命令行启动namesrv时,最终会以NamesrvStartup作为为启动类,所以这篇主要来记录一下NamesrvStartup的源码分析。分析的RocketMQ的版本是4.3.1。NamesrvStartup首先我觉得在看源码的时候,需要把握住一个类的大概流程,而不是看到一个功能块就deep进去。首先要明白namesrv是用来做什么的,简单的来考虑就是一个提供了通信功能...原创 2018-12-11 09:30:31 · 931 阅读 · 0 评论 -
RocketMQ 源码分析 nameser启动(一)
前言在RocketMQ中,NameServer的目的是为了解耦Broker和Producer、Consumer。官方文档对NameServer有一个概括:NameServer是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。而且在启动MQ的时候,第一个启动必须是NameServer。所以这篇主要来记录一下NameServer启动的源码分析。脚本启动无论在Windows或者是Linux...原创 2018-12-08 20:31:09 · 875 阅读 · 0 评论