RocketMQ消息存储原理(下)

简介: RocketMQ消息存储原理(下)
对于数据的写入
OS会先写入至Cache内
随后通过异步的方式由pdflush内核线程将Cache内的数据刷盘至物理磁盘上

image.png

对于数据的读取
如果一次读取文件时出现未命中PageCache的情况
OS从物理磁盘上访问读取文件的同时
会顺序对其他相邻块的数据文件进行预读取

消费队列的读性能几乎接近读内存的原因


在消息堆积的情况下也不会影响性能

  • 存储的数据较少
  • page cache机制预读取
  • 顺序读取

消息存储的日志数据文件CommitLog的读取会严重影响性能


读取消息内容会产生较多的随机访问读取

如何提升随机读性能

在块存储采用SSD的话 
选择合适的系统IO调度算法 
比如Deadline算法
随机读的性能会有所提升


文件的读写操作


传统的IO方式

image.png

传统的IO方式
用户态空间的进程要读写磁盘文件
需要经过内核空间
用户进程访问内核空间的缓存
如果没有的话 则读取磁盘文件
用户进程写入文件 先写入内核空间的socket缓存
再通过网卡写入到磁盘
经过2次DMA拷贝+2次CPU拷贝
4次上下文切换


RocketMQ mmap+write

image.png

1、页缓存是对磁盘数据的缓存
2、用户先读取页缓存 
如果没有数据则读取磁盘
根据局部性原理
将相邻磁盘块读入页缓存
3、用户将数据写入页缓存
异步线程将小的写入操作合并成大的写入
然后刷入磁盘
4、顺序写入磁盘 磁头几乎不用换道 
5、异步刷盘 容易丢失数据
a、可以同步刷盘 但性能低
b、一般采用多副本机制保证消息的可靠
6、数据追加到日志文件的尾部
老的消息无法更改

mmap利用内存映射文件来避免拷贝

image.png

用户空间可以通过映射地址加偏移量的方式直接操作内核空间的页缓存
避免了内核态再拷贝到用户态

rocketmq采用mmap+write方式实现文件读写操作

image.png

产生2次DMA拷贝+1次CPU拷贝
4次上下文切换
通过内存映射减少了一次CPU拷贝
可以减少内存使用
适合大文件的传输


对比Kafafa sendfile

sendfile

image.png

1、用户进程通过sendfile()方法向操作系统发起调用上下文从用户态转向内核态
2、DMA控制器把数据从硬盘中拷贝到读缓冲区
3、CPU将读缓冲区中数据拷贝到socket缓冲区
   DMA控制器把数据从socket缓冲区拷贝到网卡
   上下文从内核态切换回用户态
   sendfile调用返回
2次用户态和内核态的上下文切换
3次拷贝
sendfile方法IO数据对用户空间完全不可见
所以只能适用于完全不需要用户空间处理的情况
比如静态文件服务器

sendfile+DMA gather


image.png

1、用户进程通过sendfile()方法向操作系统发起调用 
  上下文从用户态转向内核态
2、DMA控制器利用scatter把数据从硬盘中拷贝到读缓冲区离散存储
3、CPU把读缓冲区中的文件描述符和数据长度发送到socket缓冲区
4、DMA控制器根据文件描述符和数据长度  
   使用scatter/gather把数据从内核缓冲区拷贝到网卡
5、sendfile()调用返回,上下文从内核态切换回用户态
DMA gather和sendfile一样数据对用户空间不可见
而且需要硬件支持
同时输入文件描述符只能是文件
但是过程中完全没有CPU拷贝过程
极大提升了性能
产生2次DMA拷贝
没有CPU拷贝
而且也只有2次上下文切换


相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
4月前
|
消息中间件 存储 数据库
深入学习RocketMQ的底层存储设计原理
文章深入探讨了RocketMQ的底层存储设计原理,分析了其如何通过将数据和索引映射到内存、异步刷新磁盘以及消息内容的混合存储来实现高性能的读写操作,从而保证了RocketMQ作为一款低延迟消息队列的读写性能。
|
1月前
|
消息中间件 存储 Kafka
RocketMQ 工作原理图解,看这篇就够了!
本文详细解析了 RocketMQ 的核心架构、消息领域模型、关键特性和应用场景,帮助深入理解消息中间件的工作原理。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
RocketMQ 工作原理图解,看这篇就够了!
|
1月前
|
消息中间件 存储 Kafka
MQ 消息队列核心原理,12 条最全面总结!
本文总结了消息队列的12个核心原理,涵盖消息顺序性、ACK机制、持久化及高可用性等内容。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
4月前
|
消息中间件 负载均衡 API
RocketMQ生产者负载均衡(轮询机制)核心原理
文章深入分析了RocketMQ生产者的负载均衡机制,特别是轮询机制的实现原理,揭示了如何通过`ThreadLocal`技术和消息队列的选播策略来确保消息在多个队列之间均衡发送,以及如何通过灵活的API支持自定义负载均衡策略。
|
4月前
|
消息中间件 存储 负载均衡
RocketMQ消费者消费消息核心原理(含长轮询机制)
这篇文章深入探讨了Apache RocketMQ消息队列中消费者消费消息的核心原理,特别是长轮询机制。文章从消费者和Broker的交互流程出发,详细分析了Push和Pull两种消费模式的内部实现,以及它们是如何通过长轮询机制来优化消息消费的效率。文章还对RocketMQ的消费者启动流程、消息拉取请求的发起、Broker端处理消息拉取请求的流程进行了深入的源码分析,并总结了RocketMQ在设计上的优点,如单一职责化和线程池的使用等。
RocketMQ消费者消费消息核心原理(含长轮询机制)
|
4月前
|
消息中间件 存储 RocketMQ
2分钟看懂RocketMQ延迟消息核心原理
本文从源码层面解析了RocketMQ延迟消息的实现原理,包括延迟消息的使用、Broker端处理机制以及定时任务对延迟消息的处理流程。
2分钟看懂RocketMQ延迟消息核心原理
|
4月前
|
消息中间件 存储 缓存
RocketMQ发送消息原理(含事务消息)
本文深入探讨了RocketMQ发送消息的原理,包括生产者端的发送流程、Broker端接收和处理消息的流程,以及事务消息的特殊处理机制,提供了对RocketMQ消息发送机制全面的理解。
RocketMQ发送消息原理(含事务消息)
|
5月前
|
消息中间件 存储 Kafka
MetaQ/RocketMQ 原理问题之RocketMQ DLedger融合模式的问题如何解决
MetaQ/RocketMQ 原理问题之RocketMQ DLedger融合模式的问题如何解决
|
5月前
|
消息中间件 运维 RocketMQ
MetaQ/RocketMQ 原理问题之slave broker是从master同步信息的问题如何解决
MetaQ/RocketMQ 原理问题之slave broker是从master同步信息的问题如何解决
|
4月前
|
消息中间件 Kafka Apache
RocketMQ - 生产者原理
RocketMQ - 生产者原理
53 0