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的成员变量,它代表着被映射的磁盘空间。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ中lazyqueue队列

lazyqueue队列非常强悍 springboot注解方式开启 // 使用注解的方式lazy.queue队列模式 非常GoodRabbitListener(queuesToDeclare Queue(name "lazy.queue",durable "true",arguments Argument(name "x-queue-mode",value "lazy&…

3.蓝牙模块HC-08

目录 一.简介​编辑 二.主要参数 三.模块引脚说明 四、LED指示灯状态 五.AT指令 5.1AT指令重点 5.2 AT指令注意点 5.3 AT指令集 六.AT常用指令 6.1 测试指令 AT 6.2 查询当前参数ATRX 6.3设置主从模式 ATROLE 6.4设置蓝牙模式 ATNAME 6.5 设置波特率 …

【FFmpeg】AVFormatContext结构体

【FFmpeg】AVFormatContext结构体 1.AVFormatContext结构体1.2 const struct AVInputFormat *iformat1.3 const struct AVOutputFormat *oformat 参考: FFMPEG结构体分析:AVFormatContext 示例工程: 【FFmpeg】调用ffmpeg库实现264软编 【FF…

YOLOv5改进(八)--引入Soft-NMS非极大值抑制

文章目录 1、前言2、各类NMS代码实现2.1、general.py 3、各类NMS实现3.1、Soft-NMS3.2、GIoU-NMS3.3、DIoU-NMS3.4、CIoU-NMS3.5、EIoU-NMS 4、目标检测系列文章 1、前言 目前yolov5使用的是NMS进行极大值抑制,本篇文章是要将各类NMS添加到yolov5中,同时…

6.25作业

1.整理思维导图 2.终端输入两个数,判断两数是否相等,如果不相等,判断大小关系 #!/bin/bash read num1 read num2 if [ $num1 -eq $num2 ] then echo num1num2 elif [ $num1 -gt $num2 ] then echo "num1>num2" else echo &quo…

【基于构件的软件工程开发模型】

文章目录 前言一、基本概念二、优点1. 可重用性2. 易于维护3. 并行开发4. 灵活性 三、缺点1. 构件选择2. 接口管理3. 效率问题 前言 基于构件的开发模型是一种常见的方法之一,它将软件系统划分为独立的构件,并通过组装这些构件来构建整个系统。 一、基本…

200.回溯算法:子集||(力扣)

class Solution { public:vector<int> res; // 当前子集vector<vector<int>> result; // 存储所有子集void backtracing(vector<int>& nums, int index, vector<bool>& used) {result.push_back(res); // 将当前…

Unity 公用函数整理【二】

1、在规定时间时间内将一个值变化到另一个值&#xff0c;使用Mathf.Lerp实现 private float timer;[Tooltip("当前温度")]private float curTemp;[Tooltip("开始温度")]private float startTemp 20;private float maxTemp 100;/// <summary>/// 升…

【嵌入式Linux】<总览> 进程间通信(更新中)

文章目录 前言 一、管道 1. 概念 2. 匿名管道 3. 有名管道 二、内存映射区 1. 概念 2. mmap函数 3. 进程间通信&#xff08;有血缘关系&#xff09; 4. 进程间通信&#xff08;没有血缘关系&#xff09; 5. 拷贝文件 前言 在文章【嵌入式Linux】&#xff1c;总览&a…

ArkTS开发系列之事件(2.8.2手势事件)

上篇回顾&#xff1a;ArkTS开发系列之事件&#xff08;2.8.1触屏、键鼠、焦点事件&#xff09; 本篇内容&#xff1a;ArkTS开发系列之事件&#xff08;2.8.2手势事件&#xff09; 一、绑定手势方法 1. 常规手势绑定方法 Text(手势).fontSize(44).gesture(TapGesture().onAct…

Latex学习之fontspect宏包

Latex学习之fontspect宏包 一、简介 fontspec 宏包是 XeLaTeX 和 LuaLaTeX 编译器的字体配置工具。它允许用户直接使用操作系统中安装的任何 OpenType 或 TrueType 字体&#xff0c;使用 fontspec 宏包&#xff0c;你可以轻松地设置文档的主字体、 sans-serif 字体、 monospac…

浏览器断点调试(用图说话)

浏览器断点调试&#xff08;用图说话&#xff09; 1、开发者工具2、添加断点3、查看变量值 浏览器断点调试 有时候我们需要在浏览器中查看 html页面的js中的变量值。1、开发者工具 打开浏览器的开发者工具 按F12 &#xff0c;没反应的话按FnF12 2、添加断点 3、查看变量值

nodejs - - - - - 文件上传

文件上传 1. 代码如下 1. 代码如下 // 引入需要的依赖&#xff08;multer需要提前安装&#xff09; const multer require("multer"); const path require("path"); const fs require("fs");const imgPath "/keep/"; // 文件保存…

利用ref实现防抖

结合vue的customRef function debounceRef(value,time1000){ let t return customRef((track,trigger)>{ return { get(){ track() return value; } set(val){ clearTimeout(t) tsetTimeout(()>{ trigger() valueval },time) } } }) }

大模型日报2024-06-25

大模型日报 2024-06-25 大模型资讯 大模型产品 大模型论文 GenoTEX&#xff1a;基因表达数据探索基准 摘要: GenoTEX提供自动化基因表达数据探索的基准数据集&#xff0c;包含数据选择、预处理和统计分析&#xff0c;支持LLM方法评估和开发。 多模态任务向量实现多样本上下文学…

清理占道经营商贩自砸西瓜?智慧城管AI视频方案助力城市街道管理

一、背景分析 近日有新闻报道&#xff0c;在山西太原&#xff0c;城管凌晨3时许查处商贩占道经营&#xff0c;商贩将西瓜砸碎一地&#xff0c;引起热议。据悉&#xff0c;事件发生的五龙口街系当地主要街道&#xff0c;来往车辆众多。该商贩长期在该地段占道经营&#xff0c;影…

昇思25天学习打卡营第2天|快速入门

快速入门 操作步骤1.引入依赖包2.下载Mnist数据集3.划分训练集和测试集4.数据预处理5.网络构建6.模型训练7.保存模型8.加载模型9.模型预测 今天通过昇思大模型平台AI实验室提供的在线Jupyter工具&#xff0c;快速入门MindSpore。 目标&#xff1a;通过MindSpore的API快速实现一…

《昇思 25 天学习打卡营第 6 天 | 函数式自动微分 》

《昇思 25 天学习打卡营第 6 天 | 函数式自动微分 》 活动地址&#xff1a;https://xihe.mindspore.cn/events/mindspore-training-camp 签名&#xff1a;Sam9029 函数式自动微分 自动微分是深度学习中的一个核心概念&#xff0c;它允许我们自动计算模型参数的梯度&#xff0c…

云计算 | 期末梳理(下)

1.模运算 2. 拓展欧几里得算法 3.扩散和混淆、攻击的分类 香农的贡献:定义了理论安全性,提出扩散和混淆原则,奠定了密码学的理论基础。扩散:将每一位明文尽可能地散布到多个输出密文中去,以更隐蔽明文数字的统计特性。混淆:使密文的统计特性与明文密钥之间的关系尽量复杂…

深入解析直播带货系统源码:短视频商城APP开发全攻略

本篇文章&#xff0c;小编将深入解析直播带货系统的源码&#xff0c;并为开发短视频商城APP提供全攻略&#xff0c;助力开发者打造高效、稳定的带货平台。 一、直播带货系统概述 直播带货系统主要由直播模块、商品管理模块、订单处理模块、用户管理模块、以及支付模块等组成。…