RocketMq存储管理分析

在这里插入图片描述
1、生产者发送消息给mq
2、mq将消息持久化存储到存储系统
3、mq发送ack给生产者
4、mq将消息推送给消费者
5、消费者发送ack给mq
6、mq将消息从存储系统中删除

存储介质
1、关系型数据库DB
2、文件系统

文件系统如何保证读写速度
1、写需要顺序写
2、读需要零拷贝,Java中通过MappedByteBuffer实现零拷贝(一次只能映射1.5G-2G文件至用户态的虚拟内存,所以RocketMq默认设置单个CommitLog日志数据文件为1G的原因)
在这里插入图片描述
零拷贝绕过了将数据拷贝到用户态的步骤,直接将数据拷贝到网络驱动内核

rocketMq存储结构
在这里插入图片描述
1、文件存放在commitLog中(存储消息内容,也包含consumerQueue),大小为1G。

2、consumerQueue 消费逻辑队列(消息索引),将其加载到内存,加快索引速度。
引入的目的主要是提高消息消费的性能,由于RocketMQ是基于主题topic的订阅模式,消息消费是针对主题进行的,如果要遍历commitlog文件中根据topic检索消息是非常低效的。Consumer即可根据ConsumeQueue来查找待消费的消息。其中,ConsumeQueue(逻辑消费队列)作为消费消息的索引,保存了指定Topic下的队列消息在CommitLog中的起始物理偏移量offset,消息大小size和消息Tag的HashCode值。

3、IndexFile索引文件,提供了一种通过key或者实际区间来查消息的方法。

刷盘机制
同步刷盘
安全可靠的,在mq在收到生产者发送来的消息后,立即通知刷盘线程将消息刷到磁盘后,刷盘线程执行完成后唤醒等待的线程,才会去给生产者发送ACK,确保消息已经落盘

异步刷盘
不可靠,在mq收到消息后立即给生产者发送ACK,然后启异步线程将消息落盘。但是响应速度快,吞吐量大。当内存中的消息量达到一定程度时,同意触发刷磁盘动作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章