rocketMQ的消息存储CommitLog

本来是放到上一篇中撑撑场面,确实写的水,但是上一篇数据不好,只能重新开一篇啦,再水就应该换名"小水"了,可不能再水

持久化

下面咱们就硬转到持久化

rocketmq将消息存储到磁盘,默认路径是/{user_home}/store,当然这么重要的配置是可以通过配置文件修改的

commitlog

  1. commitlog里面是本本分分按顺序以固定格式存储的完整的消息内容和他的元数据 ‌‌(消息的主题(Topic)、队列ID(QueueId)、消息体(Body)、消息ID、时间戳等),能写这么长句也是看出文学水平一般了
    1. 生产者将消息给到broker,broker转身就送给了commitlog,也不是说送,转身就把这脏活累活安排给了commitlog
    2. commitlog不辱使命通过顺序写入,理所当然可以借助磁盘顺序I/O提升了写入性能
    3. 结合内存映射和异步刷盘保障了数据的高可靠性和高性能‌
    4. 关于固定格式:每个消息包含头部信息和实际内容,这种结构支持后续的高效检索和消费‌。
    5. 默认情况下是由多个1G的文件组成;

主要是字节存储,这样用很少的空间存储众多的关键信息,很有智慧,当然其他的中间件也大多是这样的思维方式,像咱们常用的对象也是,大智慧无处不在!

代码层面

最主要(当然都必不可少)mappedFileQueue,队列还能存什么,大家猜一猜?

里面就是咱们的文件数组了,当然代码层面是MappedFile!

mappedFile调用init方法,通过RandomAccessFile创建了commitlog,并保存到MappedByteBuffer中,没错看到buffer就知道他是一个内存缓冲区,

这大宝贝在很多时候都起着至关重要的作用,可谓承上启下的法宝,但是buffer终究是没那么大,太大就是磁盘了,没必要磁盘叠磁盘,所以她应当是小巧灵活的,先写buffer内存缓冲区再flush写入磁盘;

说到flush这也是骨灰级老玩家了,一般(异步)刷新到磁盘那方法不是这flush就是那flush,看起来亲切也好学,不得不感慨大神们都代码优雅,实在是优雅!

这和咱们上面说的不谋而合,本来也是一个东西

话说这都存进去了,如何读出来呢?

org.apache.rocketmq.store.CommitLog#getMessage

---看着名字起的,真的是令人心旷神怡

简单来说通过offset偏移量找mapperFile 再多余翻译一下就是通过偏移量找到目标文件(细枝末节的顶配的重要)

下面看到没,再次借助我们的buffer,从此轻松高效获取信息,要不说rocketmq快呢,用心都在细节处

看看上面代码是不是很熟悉,不得不说人家源码这名字起的!一目了然,当然要是想知道得更多还需要去挖代码,去c那里多看一看 瞧一瞧

再写就有点长了,暂时可以告一段路啦

相关推荐
小江的记录本4 天前
【RocketMQ】RocketMQ核心知识体系全解(5大核心模块:架构模型、事务消息两阶段提交、回查机制、延迟消息、顺序消息)
linux·运维·服务器·前端·后端·架构·rocketmq
__土块__5 天前
一次支付清结算系统线程池故障复盘:从任务积压到异步解耦的架构演进
java·消息队列·rocketmq·线程池·支付系统·故障复盘·异步架构
-南帝-6 天前
RocketMQ2.3.5+SpringBoot 3.2.11+ java17安装-集成-测试案例
java·spring boot·rocketmq
zs宝来了6 天前
RocketMQ 存储原理:CommitLog 与 ConsumeQueue 设计
rocketmq·存储·commitlog·consumequeue
饺子大魔王的男人7 天前
Linux 下 Apache RocketMQ 部署与公网访问实现指南
linux·apache·rocketmq
qq_40999093?11 天前
消息中间件:RabbitMQ、RocketMQ、Kafka快速上手
kafka·rabbitmq·rocketmq
羑悻的小杀马特13 天前
从入门到稳定运行:RocketMQ 5.3.4 单机版安装与开机自启配置详解
运维·服务器·rocketmq
阿里云云原生15 天前
Agent 语音交互如何更稳、更快?一次高并发消息链路优化实践
rocketmq
狼与自由15 天前
RocketMQ 如何保证消息不被重复消费
rocketmq