刷盘机制

467701cf74cc4743b0b5224e08de5548.png

81579fa4cbf3485289c5b64f74ef7d4f.png

同步刷盘

4cf3d13731154dfaa7752a12f0b56c32.png

代码实现

写入线程

写入线程可能同时有多个,但是刷盘线程至始至终就是一个单线程

刷盘线程,始终是操作双缓冲区域,一个用来刷盘,另一个用来接收多个写入线程同时写入刷盘请求

刷盘线程

通过这种方式,实现一次flush操作,能把多个写入线程同时写入到MappedFile中的多条消息,一次性的刷入磁盘,也就是实现了“批量刷盘”的效果

异步刷盘

fad5acb97f114655a4ef3e4f3ecbf99a.png

5b18ca5fbb8c4c62b05de4aefab35726.png

这里一共有三种线程,FlushRealTimeService,CommitRealTimeService,broker写入主线程。CommitLog这个类负责来协调这三种线程,这三种线程沟通的桥梁,就是MappedFileQueue中的lastMappedFile。

broker写入主线程,和CommitRealTimeService负责往桥梁中写入消息并唤醒FlushRealTimeService线程,而FlushRealTimeService线程被前面两个线程唤醒后,就去将桥梁中新写入的消息flush到磁盘上去。

三个线程具体是如何协调的:

开启了堆外内存后,broker写入主线程会把消息写入到从堆外内存池借来的byteBuffer中,再由CommitRealTimeService线程,通过当前要写入的MappedFile的fileChannel字段,调用fileChannel.write(byteBuffer)来将byteBuffer中的消息,写入PageCache。CommitRealTimeService写入完成后,就调用FlushRealTimeService#wakeup()唤醒FlushRealTimeService线程,FlushRealTimeService线程,最后去将桥梁中新写入的消息flush到磁盘上去。

没开启堆外内存时,broker写入主线程会直接把消息写入到当前MappedFile的mappedByteBuffer字段中(也就是直接写入了PageCache中)。写入完成后,broker写入主线程就调用FlushRealTimeService#wakeup()唤醒FlushRealTimeService线程,FlushRealTimeService线程,最后去将桥梁中新写入的消息flush到磁盘上去。

一般有两种,有两种方式进行读写
(1)第一种,Mmap+PageCache的方式,读写消息都走的是pageCache,这样子读写都在pagecache里面不可避免会有锁的问题,在并发的读写操作情况下,会出现缺页中断降低,内存加锁,污染页的回写。
(2)第二种,DirectByteBuffer(堆外内存)+PageCache的两层架构方式,这样子可以实现读写消息分离,写入消息时候写到的是DirectByteBuffer——堆外内存中,读消息走的是PageCache(对于DirectByteBuffer是两步刷盘,一步是刷到PageCache,还有一步是刷到磁盘文件中),带来的好处就是,避免了内存操作的很多容易堵的地方,降低了时延,比如说缺页中断降低,内存加锁,污染页的回写。

视频地址:04-RocketMQ刷盘机制_哔哩哔哩_bilibili

面试题部分

头条面试:RocketMQ为何默认使用mmap,并且可配置成FileChannel异步发送消息

注意上面mmap的方式就一个参数,每500ms,将pagecache中的数据刷入磁盘一次

fileChannel的方式有三个参数,200ms从堆外内存刷到pagecache一次、200ms或者4个pagecache页满了就从pagecache刷入磁盘一次

两种方式从写入速度上进行的对比

因为rocketmq从最开始就是定位为业务处理MQ,大多数时候都是发送小数据,所以rocketmq默认就是使用的mmap的方式。但是rocketmq也借鉴并保留了kafka的方式的fileChannel的方式,因为kafka只要用在大数据场景

s

视频地址:头条面试:RocketMQ为何默认使用mmap,并且可配置成FileChannel异步发送消息_哔哩哔哩_bilibili

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

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

相关文章

Java与Vue技术搭建的SRM招标采购管理系统,提供源码,涵盖招标、投标、评标全流程,助力企业高效规范采购管理

前言:在当今竞争激烈的商业环境中,高效、透明、规范的招标采购流程对于企业的成本控制、供应链稳定以及整体运营效率至关重要。SRM招标采购管理系统应运而生,它借助先进的信息技术,整合了招标采购的各个环节,实现了采购…

Kotlin集合分组

集合的分组(Grouping) 在之前的学习中,我们已经学会了如何对集合进行过滤、排序或执行聚合操作。 在本节中,我们将学习如何对集合元素进行分组,以便以最适合我们任务的方式呈现信息。分组(Grouping&#xf…

阿里云ssh证书过期,如果更换并上传到服务器

登录阿里云平台,在控制台中找到“数字证书管理服务”进入频道后,选择“SSL证书管理”点击“创建证书”,创建成功后,进入证书详情页选择“下载”板块,根据自身服务器类型,下载相应的证书即可服务器更新证书登…

【软件系统架构】系列七:系统性能——计算机性能深入解析

目录 一、什么是计算机性能? 二、计算机性能核心指标 1. CPU性能指标 2. 内存性能指标 3. 存储子系统性能 4. 网络性能指标 5. 系统资源使用与并发能力 三、性能瓶颈分析方法 四、计算机性能评测与对比 常见性能测试指标与工具: 五、计算机性…

基于现代R语言【Tidyverse、Tidymodel】的机器学习方法

机器学习已经成为继理论、实验和数值计算之后的科研“第四范式”,是发现新规律,总结和分析实验结果的利器。机器学习涉及的理论和方法繁多,编程相当复杂,一直是阻碍机器学习大范围应用的主要困难之一,由此诞生了Python…

Python暑期学习笔记5

时间:2025.7.18学习内容:【语法基础】while循环与循环嵌套一、循环语句循环流程图二、while循环基本格式:while条件:循环体(条件满足时段做的事情)改变变量死循环while True:循环体(要循环做的事…

world models and Human–Object Interaction (HOI)

Author: Chatgpt Here are several key research papers that explore the intersection of world models and Human–Object Interaction (HOI)—especially ones that build structured, object-centric representations from videos or use world-model-based learning to p…

无人值守共享自习室物联系统安全防线:从设备到数据的全面防护策略!

在“全民学习”浪潮的推动下,无人值守共享自习室凭借24小时开放、灵活预约和沉浸式体验,已成为城市学习空间的新形态。而当人力值守被物联网设备替代后,安全风险却从物理世界延伸到了数字世界。一套完整的自习室物联网系统包含门禁、传感器、…

【27】MFC入门到精通——MFC 修改用户界面登录IP IP Address Control

界面搭建 将【IP Address Control】控件,【Edit Control】控件和两个【button】控件分别拖入主界面 将ID分别修改为:IDC_IP_ADDRESS IDC_IPADDRESS_EDIT IDC_GET_BUTTON IDC_CLEAN_BUTTON添加变量 为【IP Address Control】控件添加变量【m_IPaddress】&…

MacOS安装linux虚拟机

在学习docker时用的云环境本身就是一个容器,启动docker总是各种问题,所以直接在本机上装一个虚拟机。 当前系统环境: 安装虚拟机软件 安装UTM 下载官网:https://mac.getutm.app/ uname -m查看一下指令架构,下载…

TimSort:论Java Arrays.sort的稳定性

TimSort 是一种混合的、稳定的排序算法,结合了归并排序(Merge Sort)和二分插入排序(Binary Insertion Sort)的优点,尤其适用于部分有序的数据。在 Java 中,Arrays.sort() 对对象数组排序时内部使…

企业数据生命周期安全架构设计

数据是企业的生命线,而安全则是这条生命线的保护神。今天我们就来聊聊如何为企业数据的一生一世构建一套坚不可摧的安全防护体系。 📚 文章目录 为什么需要数据生命周期安全架构数据生命周期全景图安全架构设计的核心原则各阶段安全防护策略整体安全架构…

【Java】字符串常量池

文章目录一.字符串常量池(StringTable)1.1 定义1.2 演示示例1.3 intern方法一.字符串常量池(StringTable) 1.1 定义 字符串常量词本质是一个固定大小的HashTable。当用一个字符串构造String对象时,首先会去StringTable中查看是否存在在字符串,如果存在…

数据通信与计算机网络——模拟传输

主要内容数字到模拟转换幅移键控ASK频移键控FSK相移键控PSK正交振幅调制QAM模拟信号调制调幅AM调频FM调相PM一、数字到模拟转换数字信号需要低通通道,如果现实应用中只有带通通道,只能选择模拟信号进行传输。将数字数据转换为带通模拟信号,传…

如何用Python并发下载?深入解析concurrent.futures 与期物机制

concurrent.futures模块的核心价值 Python的concurrent.futures模块提供了线程池(ThreadPoolExecutor)和进程池(ProcessPoolExecutor)两种并发模型,通过高层接口简化并发编程。其核心优势在于: 自动管理资源…

MMKV 存储json list数据(kotlin)

1、添加依赖与初始化 首先在 build.gradle 中添加 MMKV 依赖: implementationcom.tencent:mmkv:1.2.12 在 Application 类中初始化 MMKV: import android.app.Application import com.tencent.mmkv.MMKVclass MyApp : Application() { override fun onCreate() { super.o…

C++ -- STL-- stack and queue

////// 欢迎来到 aramae 的博客,愿 Bug 远离,好运常伴! ////// 博主的Gitee地址:阿拉美 (aramae) - Gitee.com 时代不会辜负长期主义者,愿每一个努力的人都能达到理想的彼岸。1. stack的介绍和使用 2. queue的介绍…

信息论至AI实践:交叉熵的原理全景与应用深度解析

1 定义与数学原理:从信息论到分布差异度量 交叉熵(Cross Entropy)是信息论中用于量化两个概率分布差异的核心概念,由Claude Shannon的信息论发展而来。它测量了在相同事件集合上,使用估计的概率分布q对服从真实概率分…

WAF 能防御哪些攻击?

WAF(Web 应用防火墙)是网站和Web应用的安全守门人,但很多用户对其具体防御范围一知半解。实际上,WAF 能针对性拦截多种网络攻击,从常见的注入攻击到复杂的恶意爬虫,覆盖Web安全的核心威胁。本文详解WAF的防…

闲庭信步使用图像验证平台加速FPGA的开发:第二十二课——图像直方图统计的FPGA实现

(本系列只需要modelsim即可完成数字图像的处理,每个工程都搭建了全自动化的仿真环境,只需要双击top_tb.bat文件就可以完成整个的仿真,大大降低了初学者的门槛!!!!如需要该系列的工程…