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.rhkb.cn/news/357185.html

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

相关文章

Python数据容器

容器定义列表 list定义下标索引列表的方法查询指定元素的下标 index(元素)修改指定下标的元素值插入元素 insert(index,元素)追加一个元素 append(元素)追加一批元素 extend(容器)删除指定下标的元素删除指定元素的第一次出现 remove(元素)清空列表 clear()统计列表中指定元素的…

SD-WAN组网如何帮助企业降低网络成本?

企业在构建IT网络时,常常面临节省费用和提升效益的挑战。IT开销主要包括设备、网络和维护成本。利用OgCloud的SD-WAN组网方案,企业可以有效地应对这些问题。 企业专线网络的高成本问题 企业专线的费用较高,而且数据不能同时在多条专线上传输。…

[FreeRTOS 功能应用] 互斥访问与回环队列 功能应用

文章目录 一、基础知识点二、代码讲解三、结果演示四、代码下载 一、基础知识点 [FreeRTOS 基础知识] 互斥访问与回环队列 概念 [FreeRTOS 内部实现] 互斥访问与回环队列 [FreeRTOS 内部实现] 创建任务 xTaskCreate函数解析 本实验是基于STM32F103开发移植FreeRTOS实时操作系…

“论微服务架构及其应用”写作框架,软考高级,系统架构设计师

论文真题 论微服务架构及其应用近年来,随着互联网行业的迅猛发展,公司或组织业务的不断扩张,需求的快速变化以及用户量的不断增加,传统的单块(Monolithic)软件架构面临着越来越多的挑战,已逐渐…

关于DrawTools的分析- 一个优秀的C#开源绘图软件

国外大佬,曾经写过两个关于DrawTools相关的开源绘图软件。 我更新了一个优化的版本如下图,稍后会发布更新给大家。 需要的用户可发邮件给我 448283544qq.com 应用于AGV地图编辑器如下: 那么这个优于很多普通的画布软件,包含点、…

STM32项目分享:家庭环境监测系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板打样焊接图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片: 哔哩哔哩视频链接: https://www.bilibili.…

系统架构师概述

引言 系统架构设计师是项目开发活动中的众多角色之一,它可以是一个小组或者一个人或者是一个团队,架构师包含建筑师,设计师,创造者,缔造者,可以说架构师就是我们社会各个领域的创造者和缔造者。从组织上划分…

【OS基础】符合AUTOSAR标准的RTAOS-Alarms详解

目录 前言 正文 7.报警Alarms 7.1配置Alarms 7.1.1激活一个任务 7.1.2 设置一个事件 7.1.3报警回调Alarm Callback 7.1.4 增加计数器值 7.2设置Alarms 7.2.1 绝对Alarms 7.2.2 相对Alarm 7.3自启动Alarms 7.4 删除Alarms 7.5确认何时会发生Alarm 7.6非周期Alarm…

Golang | Leetcode Golang题解之第179题最大数

题目&#xff1a; 题解&#xff1a; func largestNumber(nums []int) string {sort.Slice(nums, func(i, j int) bool {x, y : nums[i], nums[j]sx, sy : 10, 10for sx < x {sx * 10}for sy < y {sy * 10}return sy*xy > sx*yx})if nums[0] 0 {return "0"…

网络安全-如何设计一个安全的API(安全角度)

目录 API安全概述设计一个安全的API一个基本的API主要代码调用API的一些问题 BasicAuth认证流程主要代码问题 API Key流程主要代码问题 Bearer auth/Token auth流程 Digest Auth流程主要代码问题 JWT Token流程代码问题 Hmac流程主要代码问题 OAuth比较自定义请求签名身份认证&…

Golang | Leetcode Golang题解之第167题两数之和II-输入有序数组

题目&#xff1a; 题解&#xff1a; func twoSum(numbers []int, target int) []int {low, high : 0, len(numbers) - 1for low < high {sum : numbers[low] numbers[high]if sum target {return []int{low 1, high 1}} else if sum < target {low} else {high--}}r…

示例:WPF中应用Grid的SharedSizeGroup设置整齐的布局

一、目的&#xff1a;应用Grid的SharedSizeGroup设置整齐的布局 二、实现 <ItemsControl ItemsSource"{local:GetStudents Count5}"><ItemsControl.ItemTemplate><DataTemplate><Grid ShowGridLines"True"><Grid.ColumnDefinit…

51单片机STC89C52RC——3.1 数码管静态展示

目的 让数码管在指定位置显示指定数字 一&#xff0c;STC单片机模块 二&#xff0c;数码管 2.1 数码管位置 2.2 生活中用到的数目管 红绿灯 LED数码管在生活中随处可见&#xff0c;洗衣机、电饭煲、热水器、微波炉、冰箱、这些最基本的家用电器上基本都用到了这种7段LED数…

[手机Linux PostmarketOS]一,1加6T真正的手机Linux系统

前面用Linux deploy软件安装了Linux系统在手机&#xff0c;实则不是真正的手机刷成了linux系统&#xff0c;而是通过Linux deploy软件在容器里安装了Linux系统&#xff0c;在使用方面会有诸多限制&#xff0c;并不能发挥Linux的真实强大之处&#xff0c;于是我又百度又谷歌(真不…

51单片机STC89C52RC——5.1 LCD1602液晶显示屏

目录 目的 一&#xff0c;STC单片机模块 二&#xff0c;LCD1602 2.1 模块简介 2.2 针脚 2.3 DDRAM地址与显示器对应关系 2.4 标准字库表 2.5 常用指令 2.6 读写操作 三&#xff0c;创建Keil项目 四&#xff0c;代码 五&#xff0c;代码编译、下载到51单片机 六&a…

掌握Three.js:学习路线,成为3D可视化开发的高手!

学习Three.js可以按照以下路线进行&#xff1a; 基础知识&#xff1a; 首先要了解基本的Web开发知识&#xff0c;包括HTML、CSS和JavaScript。如果对这些知识已经比较熟悉&#xff0c;可以直接进入下一步。 Three.js文档&#xff1a; 阅读Three.js官方文档是学习的第一步。官…

【Flutter 专题】120 Flutter 腾讯移动通讯 TPNS~

1.2 方法使用 小菜按照官网的介绍尝试了一些常用的 API 方式&#xff0c;主要分为应用类&#xff0c;账号类和标签类三种 API&#xff0c;小菜业务中没有应用账号和标签模块&#xff0c;暂未深入研究&#xff1b; 应用接口 API a. 注册推送服务 对于服务的注册初始化&#x…

跟TED演讲学英文:How language shapes the way we think by Lera Boroditsky

How language shapes the way we think Link: https://www.ted.com/talks/lera_boroditsky_how_language_shapes_the_way_we_think? Speaker: Lera Boroditsky Date: November 2017 文章目录 How language shapes the way we thinkIntroductionVocabularySummaryTranscriptA…

目前哪个充电宝品牌比较好?四款优质充电宝分享

在电量成为现代生活不可或缺的生产资源的时代&#xff0c;选择一款优质的充电宝无疑是保证移动设备持续运作的关键。面对市场上众多品牌和型号的充电宝&#xff0c;消费者在选择时可能会感到困惑和迷茫。本文将为您揭示哪些品牌真正代表了耐用性和质量的典范&#xff0c;让自己…

贪心算法—

贪心算法是一种在每一步选择中都采取在当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是全局最好或最优的算法。这种算法并不总是能找到全局最优解&#xff0c;但在某些问题上能提供足够好的解决方案。贪心算法的关键特性包括&#…