RocketMQ消息存储学习
Page Cache
page cache 是 Linux内核实现的磁盘缓存,主要用来减少对磁盘的I/O操作,把磁盘访问变成物理内存访问。
无论通过标准I/O还是mmap,首先都是读入page cache,page cache 内核地址映射到page的物理地址。如果是标准I/O就拷贝到用户地址,如果是mmap,则将用户地址映射到相同的page物理地址。
不过mmap只建立了地址映射,所以当进程发起对映射空间访问时会引发缺页异常,从而引发磁盘文件到物理内存的拷贝。
以下参考链接[2]
标准I/O过程:
假设一个名为render的Linux程序,它打开文件scene.dat并一次读取512个字节,将文件内容存储到堆分配的块中。第一次读是这样的:
在读取了12KB以后,render的堆以及相关的页帧情况如下,上面的是page cache,下面的是用户地址空间对应的物理内存:
mmap 而mmap则直接将render进程的用户地址空间直接指向了page cache。
page cache 刷盘 page cache修改之后会变成脏页。
脏页有两种刷盘的方式:
- 异步刷盘,脏页太多或者存在太久都会导致page cache回写磁盘,Linux中可以通过 sysctl -a | grep dirty 查看相关的控制参数。
- 调用fsync、msync等。
RocketMQ消息存储
RocketMQ文件映射关系
下图来自Apache RocketMQ 中国开发者钉钉群陈厚道老师的PPT
RocketMQ中每个文件对应一个MappedFile,MappedFile由MappedFileQueue管理。
RocketMQ消息存储的两种方式
下图来自Apache RocketMQ 中国开发者钉钉群刘春龙老师的PPT
TransientStorePool主要功能是池化管理多个DirectByteBuffer对象,可以向其借与还Buffer提供给MappedFile使用。
使用DirectByteBuffer的原因可以看一下另一篇文章《Java直接内存原理》。
写数据
先讲一下上图的第二种的方式:
- appendMessage直接写到借来的writeBuffer中,调用commit方法时再通过FileChannel#write()方法写数据
第一种方式(默认方式):
- 通过FileChannel#map获得的MappedByteBuffer直接写数据
由上面的Page Cache可知两种方式操作的是同一块物理内存(MappedByteBuffer和FileChannel没有直接关系,即使FileChannel#close(),MappedByteBuffer还是可以操作文件)。
读数据
读数据只有一种方式,直接通过MappedByteBuffer读取。
关于刷盘
调用flush会将Page Cache中的数据刷到磁盘。
另外,关于两种方式,胡宗棠老师的见解。
个人想法
- DirectByteBuffer的方式如果掉电会丢失更多的数据。
- mmap + pagecache的方式数据更新更及时,毕竟读数据都是从mmap 读的。
[1]《Linux内核设计与实现》
[2] manybutfinite.com/post/page-c…
[3] www.quora.com/Linux-Kerne…
RocketMQ消息存储学习相关推荐
- RocketMQ 1.学习资料 2.面试题 3.知识点
前言 这篇文章分三方面来介绍RocketMQ 1.学习资料 2.面试题 3.知识点 学习资料 官方 官方文档 rocketmq.apache.org/docs/simple- 官方github git ...
- rocketmq消息存储原理_RocketMQ到底快在哪里?深入探索RocketMQ消息存储和查询原理...
RocketMQ 作为一款优秀的分布式消息中间件,可以为业务方提供高性能低延迟的稳定可靠的消息服务.其核心优势是可靠的消费存储.消息发送的高性能和低延迟.强大的消息堆积能力和消息处理能力. 从存储方式 ...
- RocketMQ消息存储的整体结构
RocketMQ的消息存储采用的是混合型的存储结构,也就是Broker单个实例下的所有队列公用一个日志数据文件CommitLog.这个是和Kafka又一个不同之处. 为什么不采用kafka的设计,针对 ...
- RocketMQ消息存储原理
消息存储 CommitLog 1.消息内容和元数据都会存在CommitLog日志文件中2.消息内容不是定长的3.单个文件大小默认1G 文件名长度为20位 左边补零 剩余为起始偏移量 比如第一个文件名是 ...
- RocketMQ消息存储结构分析及相对于Kafka的优势
在RocketMQ中,消息存储是由CommitLog和ConsumerQueue配合完成 消息存储结构 首先我们先来看下整体的消息存储结构 基本过程: 生产者在生产消息的时候是将消息存储在Commit ...
- RocketMQ消息存储、刷盘、负载均衡
消息存储 消息存储是RocketMQ中最为复杂和最为重要的一部分. 消息存储总体架构 消息存储架构图: minOffset:当前队列的最小消息偏移量,如果消费时指定从最早消费,就是从该偏移量消费. m ...
- RocketMQ消息存储之刷盘机制(原理篇)
一.前言 RocketMQ的刷盘机制是一种确保消息可靠性的机制,简单来说就是Broker收到消息后,将消息存储到磁盘上.这样可以解决几个问题: 存储空间问题.内存空间有限,存入磁盘可以维护更多消息. ...
- rocketmq存储消息mysql_再说rocketmq消息存储
两篇精彩的文章: rocketmq通过netty获取到消息请求后,直接掉处理模块,比如:SendMessageProcessor 这个处理类主要负责处理客户端发送消息的请求. 这个类实现了com.al ...
- RocketMQ 消息存储机制分析
- RocketMQ学习笔记(二)
第六章 RocketMQ生产者核心配置和核心知识讲解 第1集 消息队列RocketMQ4.X生产者核心配置讲解 简介:消息队列RocketMQ4.X核心配置讲解 生产者常见核心配置 compressM ...
最新文章
- python3运算符和表达式实验报告_对Python3 * 和 ** 运算符详解
- 第二、三章:信息系统项目管理基础与立项管理-章节真题
- 如何计算两个日期之间相差的天数?
- php框架之laravel
- java和cnc_Java程序员的目标,你都达到了多少条?
- python字典与顺序有关吗_python – 为什么在字典和集合中的顺序是任意的?
- Windows GDI和GDI+编程实例剖析(1)
- JavaNIO - Scatter Gather
- 雕刻机控制软件破解笔记
- 网站在线监控工具Uptime Kuma
- [索尼]笔记本电脑驱动程序安装顺序?
- 2021年程序员平均工资
- 动作游戏的打击感和音效的关系
- iOS - 手机摇一摇
- 如何关闭迅雷极速版的升级提示
- canvas示例样式_使用js canvas和atari vcs trivia制作基本html游戏的快速示例
- java基础巩固-宇宙第一AiYWM:为了维持生计,单例模式阅读总结【单例模式不同写法、在JDK中的应用】~整起
- 使用PyTorch中的预训练模型进行图像分类
- 信源编码技术作业1:使用Audacity绘制并分析清音、浊音、爆破音的频谱图
- vue 项目中的打包配置
热门文章
- 谷歌身份验证器插件以及基于utools的otp快捷使用
- 前端模板引擎 -- Freemarker
- 如何用matlab画一个球
- Openjudge1.5答案
- redis 通道 java_【java】netty4,服务端向客户端主动发消息怎么把channel存储到redis缓存中?...
- 怎样做一个软件注册程序
- 运行时 Entry name .... .. collided
- Can总线基本关注事项(仲裁、电气、阻抗计算、负载率)
- win10系统oracle删除用户,win10 清除个人数据库
- IPSec:IKEv2协议详解