RocketMQ之消息存储技术
消息存储概述
分布式队列因为有高可靠性的要求,所以数据要进行持久化存储,RocketMQ采用的是类似于Kafka的文件存储机制,即直接用磁盘文件来保存消息,而不需要借助MySQL这一类索引工具。
目前的MQ中间件从存储模型来,分为需要持久化和不需要持久化的两种模型,现在大多数的是支持持久化存储的,比如ActiveMQ、RabbitMQ、Kafka、RocketMQ等,而ZeroMQ却不支持持久化存储。业务系统也大多需要MQ有持久存储的能力,这样可以大大增加系统的高可用性。
从存储方式和效率来看,文件系统高于KV存储,KV存储又高于关系型数据库,直接操作文件系统肯定是最快的。如果从使用复杂性的角度出发,直接操作文件系统是最复杂的,关系型数据库的复杂度最低。从可靠性的角度来分析,文件系统高于KV存储,KV存储高于关系型数据库。
存储介质类型和对比
关系型数据库存储 | 分布式KV存储 | 文件系统存储 |
---|---|---|
简介 | 选用 JDBC 方式实现消息持久化,只需要简单地配置 xml 即可实现 JDBC 消息存储 | kv存储即 Key-Value 型存储中间件,如 Redis 和 RocksDB,将消息存储到这些中间件中 |
性能 | 存在性能瓶颈,如mysql在单表数据量达到千万级别的情况下,IO读写性能下降 | 通过高并发的中间件存储和处理消息,速度必然优于数据库存储方式 |
可靠性 | 该方案十分依赖DB,一旦DB出现故障,MQ消息无法落盘存储,从而导致线上故障 | KV存储一般是分布式部署,可靠性要高于DB |
项目使用 | ActiveMQ | Redis、RockDB |
存储效率:文件系统 > 分布式KV存储 > 关系型数据库DB
**开发难度和集成:文件系统> 分布式KV存储 > 关系型数据库DB **
消息存储技术
目前的高性能磁盘顺序写速度可以达到 600MB/s,足以满足一般网卡的传输速度,而磁盘随机读写的速度只有约 100KB/s,与顺序写的性能相差了 6000 倍,故好的消息队列系统都会采用顺序写的方式
注意:这里的600MB/s是大写B,相比小写b要快8倍
顺序读写和随机读写
顺序读写和随机读写对于机械硬盘来说为什么性能差异巨大
顺序读写 | 随机读写 |
---|---|
文件数目 | 读写一个大文件 |
比较 | 顺序读写只读写一个大文件,耗时更少 |
文件预读 | 顺序读写时磁盘会预读文件,即在读取的起始地址连续读取多个页面,若被预读的页面被使用,则无需再去读取 |
比较 | 在大并发的情况下,磁盘预读能够免去大量的读操作,处理速度肯定更快 |
写入数据 | 写入新文件时,只需要寻找磁盘可用空间 |
比较 | 顺序读写创建新文件,只需要创建一个大文件就可以用很久 |
读写速度
目前的高性能磁盘,顺序写速度可以达到600MB/s, 超过一般网卡传输速度,但是磁盘随机写速度只有大概100KB/s,RocketMQ的消息用顺序写保证了消息存储的速度
顺序读写与随机读写区别总结
1、顺序读写是对一个大文件,随机读写是多个小文件
2、顺序读写可以充分利用缓存机制,随机读写缓存使用率低
3、随机读写会造成硬盘频繁的寻址,造成读写效率降低
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?