RocketMQ源码学习笔记:Broker启动流程

这是本人学习的总结,主要学习资料如下

  • 马士兵教育
  • rocketMq官方文档

目录

  • 1、Broker启动流程
  • 2、一些重要的类
    • 2.1、MappedFile
    • 2.2、MessgeStore
    • 2.3、MessageStore的加载启动流程
  • 3、技术亮点
    • 3.1、 内存映射
      • 3.1.1、简介
      • 3.1.2、源码

1、Broker启动流程

Broker启动流程与NameServer的几乎一样,都是先读取外部配置并利用外部配置创建出BrokerController

接着使用创建好的BrokerController,在其initialize()方法中创建运行启动时必要的实例。

之后再start()方法中开启网络和持久化服务。

流程如下所示。

在这里插入图片描述


2、一些重要的类

在这里插入图片描述
以上是Broker中比较重要的类,他们被分成三个层次。

业务层是用于处理发送和接受信息,他们会调用逻辑存储层的对象获取基础一些的服务。

逻辑存储层的类可以看成是代表着Broker里的文件或者文件夹的,比如CommitLog这个类就代表着存储消息详细信息的commitlog文件夹;ConsumeQueue则代表存储消息队列的comsumequeue

存储I/O层里则是Broker里最贴近底层的类,比如MappedFile代表着某一个文件。

2.1、MappedFile

MappedFile代表着一个物理文件。

它是对File类的一个包装,底层还是用File访问磁盘文件。不过MappedFile增加了一些功能,比如增加了wrotePosition这个成员,代表着下次写文件时,系统可以直接通过wrotePosition知道文件的末尾在哪,这样就可以直接写入文件。

在这里插入图片描述

2.2、MessgeStore

MessageStore是用于读写存储文件的一个类。这里的存储文件是指CommitLogcomsumeQueue这些文件。

源码中使用它的实现类DefaultMessageStore,通过load()方法完成初始化,之后在开启服务的start()方法中通过start()方法开启服务。

所以MessageStore是管理存储文件的一个类。源码中还有多个和它类似的成员,他们负责不同的功能,但都是load()初始化,start()开启服务。


2.3、MessageStore的加载启动流程

MessageStore的启动加载包含了很多很多服务,比如CommitLogConsumeQueue等。但他们的加载启动都大同小异,所以这里只选了CommitLog讲解。

MessageStoreBrokerController的一个成员变量。它在BrokerController中的initialize()完成实例初始化,随后调用其load()方法更进一步地加载具体的服务。以下是涉及到的代码片段。

在这里插入图片描述


以这个线索来看CommitLog加载的具体内容,messageStore.load() -> commitLog.load() -> doLoad()

可以看出所谓的加载,就是访问/store/commitlog下的所有文件,将他们包装成MappedFile存起来,方便后续的访问。

3、技术亮点

3.1、 内存映射

3.1.1、简介

MappedFileBroker中可以说是最底层的代表文件的类,它使用了内存映射技术大大加快了文件的读写速度。

下面是网络数据到磁盘的过程。

在这里插入图片描述
一般的IO会有四次复制,两次DMA拷贝,两次CPU拷贝。

CPU拷贝的效率要慢很多,一般来说200M的数据,DMA拷贝仅需2ms,而CPU拷贝需要200ms。所以200M的数据从网络设备缓冲区到磁盘用传统的IO需要404ms

内存映射技术是建立一个磁盘空间和内存空间的映射通道,会覆盖一片磁盘空间,最大是1.5G ~ 2G

当我们向被覆盖的内存空间写数据时,数据可以通过通道到达磁盘。这种方式允许DMA直接从内存拷贝数据到磁盘。

所以应用内存映射技术后,数据从网络设备缓冲区到磁盘就只需要一次CPU拷贝,两次DMA拷贝。200m的数据只需要204ms,是传统IO的一半。

因为内存映射最多只能覆盖1.5G ~ 2G的磁盘空间,所以commitlog的文件最大是1G,保证每次映射能完整覆盖一个文件。


3.1.2、源码

内存映射的代码是放在MappedFile中,在BrokerController.initialize()阶段建立各个文件的内存映射通道。可根据一下的线索看到源码。

start() -> createBrokerController() -> controller.intialize() -> messageStore.load() -> commitLog.load() -> mappedFileQueue.load() -> doLoad() -> new MappedFile() -> init()

所以MappedFile在实例初始化时就会建立内存映射通道,以下是构造方法调用的init()的关键内容。

private void init(final String fileName, final int fileSize) throws IOException {
    this.file = new File(fileName);
    try {
    	// rw表示允许读写
        this.fileChannel = new RandomAccessFile(this.file, "rw").getChannel();
        this.mappedByteBuffer = this.fileChannel.map(MapMode.READ_WRITE, 0, fileSize);
        TOTAL_MAPPED_VIRTUAL_MEMORY.addAndGet(fileSize);
        TOTAL_MAPPED_FILES.incrementAndGet();
        ok = true;
    } catch (FileNotFoundException e) {
        log.error("Failed to create file " + this.fileName, e);
        throw e;
    } finally {
        if (!ok && this.fileChannel != null) {
            this.fileChannel.close();
        }
    }
}

可以看到,它通过new RandomAccessFile(this.file, "rw").getChannel()创建文件的内存通道,并且赋值给fileChannel。即使没有看其他的源码也可以知道,之后涉及到文件的读写操作最后一定会先获取这个fileChannel,再调用其中的read(),write()等方法进行读写。

其中还有一个叫mappedByteBuffer的成员变量,它代表着被映射的磁盘空间。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

upload-labs第14关

upload-labs第14关 第十四关一、源代码分析代码审计 二、绕过分析a. 制作图片码首先需要一个照片,然后其次需要一个eval.php。 b.上传图片码上传成功 c.结合文件包含漏洞进行访问访问:http://192.168.1.110/upload-labs-master/include.php?filehttp://…

【Spine学习16】之 人物面部绑定

1、创建头部骨骼 一根头骨 以头骨为父结点创建一个面部控制器face-holder 2、创建头发和face面部控制结点的变换约束 左右头发的约束指向为face结点 3、设定后发的变换约束,约束指向为face结点,反方向移动 设置参数为-100 同理,耳朵也依…

6.25C高级

终端输入两个数&#xff0c;判断两数是否相等&#xff0c;如果不相等&#xff0c;判断大小关系 #!/bin/bash if [ $1 -eq $2 ] thenecho $1$2 elif [ $1 -gt $2 ] thenecho "$1>$2" elseecho "$1<$2" fi 2.已知网址www.hqyj.com&#xff0c;使用e…

Java-day01--基础知识

1、计算机基础知识&#xff1a; 计算机主要是由硬件和软件组成&#xff0c;软件指的是特定顺序的计算机指令&#xff0c;硬件主要可以看成是系统软件和应用软件等。 目前java主流分成三种&#xff1a;javase&#xff08;标准版&#xff09;、javame&#xff08;小型版&#x…

TCP: 传输控制协议

TCP: 传输控制协议 TCP的服务TCP 的首部小结 本系列文章旨在巩固网络编程理论知识&#xff0c;后续将结合实际开展深入理解的文章。 TCP的服务 T C P和U D P都使用相同的网络层&#xff08;I P&#xff09;&#xff0c;T C P却向应用层提供与U D P完全不同的服务。 T C P提供一…

数据结构-----【链表:刷题】

-------------------------------------------基础题参照leetcode---------------------------------------------------------------------------------------------------------- 【2】两数相加 /*** Definition for singly-linked list.* struct ListNode {* int val;…

Midjourney 出图效果总比别人差?看看是不是这3点没做好!

前言 大家好&#xff0c;我是AI绘画咪酱~ 很多小伙伴都会在「优设 AI 绘画交流群」以及文章评论区中非常积极地和我探讨 Midjourney 的使用问题&#xff0c;我在帮助大家的同时自己也学到了不少新的技巧。今天就写一篇文章解释 3 个比较常见的疑问&#xff0c;希望对大家有帮…

vue项目无后台版本打包上传到服务器

打包项目 也可以在文件目录下npm run build 生成dist文件夹 将dist文件夹里的所有文件拷贝到站点的根目录&#xff0c;这里使用宝塔面板进行操作 前提你得先创建站点&#xff0c;域名绑定等操作

IIC学习笔记(立创STMF4开发板)

目录 #I2C涉及相关知识 #I2C相关介绍 欢迎指正&#xff0c;希望对你&#xff0c;有所帮助&#xff01;&#xff01;&#xff01; 个人学习笔记&#xff0c;参考文献&#xff0c;链接最后&#xff01;&#xff01;&#xff01; #I2C涉及相关知识 SDA串行数据线&#xff1a; Ser…

win11误删生物识别设备

不小心给删掉了&#xff0c;我当时删的时候没有打勾&#xff0c;解决方法如下&#xff1a; ************ 很简单&#xff0c; 1.点一下 设置 然后找到下面的界面&#xff0c; 2.找到圈出来的功能 3.再找 “可选更新”的功能点进去 4.一下界面可能有一个能勾选&#xff0c;也可…

怎么样才能让老旧的和颜色受损、丢失的照片重新上色呢?

怎么样才能让老旧的和颜色受损、丢失的照片重新上色呢&#xff1f;大家有时候在家中打扫卫生的时候&#xff0c;偶然发现了自己爸爸妈妈以前拍的照片&#xff0c;但是照片颜色已经受损的很严重了&#xff0c;几乎就是黑白的颜色&#xff0c;很难看清楚爸爸妈妈年轻时候的样子&a…

泵设备的监测控制和智慧运维

泵是一种输送流体或使流体增压的机械。它通过各种工作原理&#xff08;如离心、柱塞等&#xff09;将机械能转换为流体的动能或压力能&#xff0c;从而实现液体的输送、提升、循环等操作。 泵的一些具体应用场景&#xff1a; 1.智能水务&#xff1a;在城市供水管网中&#xff…

Lesson 39 Don‘t drop it!

Lesson 39 Don’t drop it! 词汇 front n. 前面 搭配&#xff1a;in front of … 在……前面&#xff08;外部&#xff09;    in the front of … 在……前面&#xff08;内部&#xff09; 例句&#xff1a;Bobby坐在Sam的前面。    Bobby is sitting in front of Sam…

mysql join on 与left join on

1.假如 有 a b 两个表&#xff0c;我们 用a表作为主表 &#xff0c;b表作为子表&#xff0c;在我们使用 left join on 查询的时候&#xff0c;如果右表没有查询到数据&#xff0c;那么右表会显示为null&#xff0c;而不是直接查询不到值 我们看例子就ok a 表 b表 我们可以看…

高考填报志愿,为何要优先考虑个人兴趣 ?

随着高考成绩纷纷出炉&#xff0c;考生又要面对人生另外一个重要的选择&#xff0c;那便是填报志愿&#xff0c;这关系到自己能否进入满意的学校和专业。如果考生对上述两个方面都不满意&#xff0c;那高考目的就没有达到。既然填报志愿如此重要&#xff0c;考生和家长在选择的…

vue3-openlayers marker 光晕扩散(光环扩散)(postrender 事件和 render 方法)

本篇介绍一下使用 vue3-openlayers marker 光晕扩散&#xff08;光环扩散&#xff09;&#xff08;postrender 事件和 render 方法&#xff09; 1 需求 marker 光晕扩散&#xff08;光环扩散&#xff09; 2 分析 marker 光晕扩散&#xff08;光环扩散&#xff09;使用 post…

three.js 第十一节 - uv坐标

// ts-nocheck // 引入three.js import * as THREE from three // 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls // 导入lil.gui import { GUI } from three/examples/jsm/libs/lil-gui.module.min.js // 导入tween import * as T…

PUBG绝地求生·阿童木透视自瞄免费辅助 v6.24

在享受电子游戏的精彩世界时&#xff0c;家庭用户的数据安全和系统稳定性是不容忽视的重要方面。为了确保在使用游戏辅助工具时既能获得愉悦的游戏体验&#xff0c;又能保障个人数据和系统的安全&#xff0c;这里有一些建议和操作指南需要大家注意。 对于家庭用户而言&#x…

【高校科研前沿】四川大学刘超研究员为一作在《Geophys. Res. Lett.》发表团队成果:植被形态影响河床泥沙输运

文章简介 论文名称&#xff1a;Plant morphology impacts bedload sediment transport 第一作者及单位&#xff1a;刘超&#xff08;研究员|四川大学水利水电学院&#xff09; 通讯作者及单位&#xff1a;Yuqi Shan&#xff08;四川大学灾后重建与管理研究所&#xff09; 文…

Java 21的最新进展

关于Java 21的最新进展&#xff0c;以下是一些重要的新特性和更新&#xff1a; 长期支持版本&#xff08;LTS&#xff09;&#xff1a;JDK 21是一个长期支持版本&#xff0c;这意味着它将获得五年的首要支持和扩展支持&#xff0c;直至2031年9月。这是继JDK 17之后的下一个LTS版…