当前位置: 首页 > news >正文

RocketMQ怎么对文件进行读写的?

RocketMQ 对文件的读写主要依赖于其底层的存储机制,核心组件是 CommitLog 和 ConsumeQueue,并且通过 MappedFile 类来进行高效的文件操作。以下是 RocketMQ 文件读写的详细介绍:

1. CommitLog

CommitLog 是 RocketMQ 的核心存储文件,所有的消息都会首先写入 CommitLog 中。它是一个顺序写入的文件,保证了写入的高效性。

写入流程
1.顺序写入:消息生产者发送的消息被写入到 CommitLog 中。由于是顺序写入,磁盘的写入效率非常高。
2.预分配文件:RocketMQ 预先分配一系列固定大小(通常是 1GB)的 CommitLog 文件,当一个文件写满时,自动切换到下一个文件继续写。
3.文件映射:通过 MappedByteBuffer 将 CommitLog 文件映射到内存中,以提高文件读写性能。
4.刷盘策略
4.1同步刷盘:每次消息写入 CommitLog 后,立即将数据刷入磁盘,保证消息的持久性。适合对数据可靠性要求高的场景。
4.2异步刷盘:消息写入 CommitLog 后,先写入内存,后续由后台线程异步将数据刷入磁盘,适合对性能要求高但容忍一定延迟的场景。

读取流程
1.顺序读取:由于消息是顺序写入的,读取时也是顺序读取,因此能够高效地从磁盘读取数据。
2.内存映射文件:使用 MappedFile 和 MappedByteBuffer,将文件映射到内存中,直接通过内存进行数据的读写操作。

2. ConsumeQueue

ConsumeQueue 是 RocketMQ 的逻辑队列,用来存储消息的索引信息,帮助消费者快速定位到 CommitLog 中的具体消息。

写入流程
1.消息索引:当消息写入 CommitLog 后,RocketMQ 会生成对应的 ConsumeQueue 条目,包括 CommitLog 的物理偏移量、消息大小、消息标签等信息。
2.顺序写入:ConsumeQueue 的写入也是顺序进行的,将索引信息顺序写入 ConsumeQueue 文件。
读取流程
1.消息定位:消费者根据 ConsumeQueue 中的索引信息,快速定位到 CommitLog 中对应的消息偏移量,然后从 CommitLog 中读取完整的消息。
2.缓存机制:ConsumeQueue 也使用 MappedFile 进行文件映射,提高读取速度。

3. MappedFile

MappedFile 是 RocketMQ 中的核心类,用于将磁盘文件映射到内存中,实现高效的文件读写操作。

主要功能
文件映射:通过 MappedByteBuffer 将磁盘文件映射到虚拟内存空间,文件的读写操作变成内存的读写,提升了性能。
顺序写入:MappedFile 的写入操作是顺序进行的,这与操作系统的磁盘顺序写入机制一致,能够充分利用磁盘的 I/O 性能。
异步刷盘:通过 flush 操作将内存中的数据异步写入磁盘,以减少刷盘带来的 I/O 开销。

4. 内存与磁盘的高效结合

RocketMQ 通过 CommitLog 和 ConsumeQueue 的分离,将消息存储与索引分开处理。通过使用内存映射文件(MappedFile),RocketMQ 实现了高效的文件读写,并在顺序写入的基础上保证了性能和数据的持久性。

总结

RocketMQ 通过 CommitLog 和 ConsumeQueue 实现了对消息的存储和索引管理,并通过 MappedFile 类结合内存映射技术,提升了文件的读写性能。顺序写入、内存映射、刷盘机制等技术使得 RocketMQ 在处理海量消息时既能保证高效性,也能确保数据的持久性和可靠性。

http://www.lryc.cn/news/419454.html

相关文章:

  • 智慧宠物护理:智能听诊器引领健康监测新潮流
  • SRE工程师第2天:我只要截图功能 而不是打开微信
  • 【RunnerGo】离线安装成功版本
  • AI 手机的技术展望
  • 实战 Springboot2 集成Redis 哨兵模式、集群模式、缓存管理、Lettuce拓扑刷新
  • MYSQL--binlog和redo log
  • R语言医疗数据分析笔记
  • SpringBoot使用Jackson-XML裁剪多余的根节点
  • vue路由学习
  • Kubernetes基于helm部署Kafka_Kraft集群并取消SASL认证且开启数据持久化
  • kotlin -- Flow和Rxjava 对比
  • 【JVM篇】自动内存管理——HotSpot虚拟机对象探秘
  • 代谢组数据分析(十七):基于structToolbox代谢组分析流程讲解
  • 科普课堂走起 | 什么是网络安全和数据安全?
  • C语言中常用的函数
  • 如何在SpringBoot中进行单元测试?
  • 分布式事务学习整理
  • Conda配置瘦身术:精通conda config --remove命令
  • Windows下编译安装PETSc
  • phpstudy搭建sqlilabs本地靶场
  • Linux 实验基础环境准备(外网篇)
  • centos8 安装mysql 制作备份数据库脚本
  • Parsing error: The keyword ‘interface‘ is reserved配置优化
  • C语言指针详解-包过系列(二)目录版
  • 驰骋BPM RunSQL_Init SQL注入漏洞复现
  • 谷粒商城实战笔记-143-性能压测-压力测试-JMeter在windows下地址占用bug解决
  • Pod的调度机制
  • JIT(即时编译)编译器
  • 循环执行时数据的同步方式
  • Jvm G1与ZGC启动参数