欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 培训 > RocketMQ源码级实现原理-存储系统概要设计

RocketMQ源码级实现原理-存储系统概要设计

2024/10/24 14:24:45 来源:https://blog.csdn.net/iNiBuBian/article/details/140479893  浏览:    关键词:RocketMQ源码级实现原理-存储系统概要设计

存储系统概要设计

主要就是讲消息从producer到达broker后,怎么落地存储

e84a13b55fe24382920ab01059adc90a.png

d50efad9b4784bf28028fb0e9d959974.png 一个好的文件系统,它的性能肯定是要优于分布式KV和newSQL;

Kafka和RocketMQ存储模型的差别

0ecbeeac8478421b8c52c457514dd0f6.png

a1d0ec40454e44bf93971fd1e0c1f400.png1. ConsumeQueue里面放的是一个个索引条目,索引条目有三个字段:CommitLogOffSet ,MessageSize、TagHashCode

2. doDispatch 异步线程 构建ConsumeQueue

 664dad52d7ec4a56a832f087e091c4f9.png

这么多MappedFile,如何管理起来对外暴露,就用一个MappedFileQueue;

a0ce5238f7304a4f88bf7c30f7731984.png

发送模块业务架构

bb57389d7bcb4ed3be7c09aa69809d33.png

存储这块的设计很好,层次很清晰

存储逻辑层,比如CommitLog类中出了对外暴露putMessage()的接口外,还需要提供一些内部类,比如FlushRealTimeService这类的刷盘线程逻辑

存储IO层,则直接和PageCache、和磁盘打交道

94552489c95e4baaa6b3ed644b4a7643.png

也就是,不同的逻辑处理,RocketMQ都会为它分配不同的线程池,比如这里,为了处理发送端发过来的消息写入磁盘,就通过sendMssageExecutor线程池来执行sendMssageProcessor中的代码,完成一条消息的写入磁盘

0e6504dfbb134643944fc7b34b6069dc.png

消息写入模块

b57cca983fc14b7caeaa45890d1a8867.png

30ebfed364524f5d95ff030fa3e23f76.png

0bb5d9d7ba644f7db052a7c648688f96.png 1f5f25bd454b4645a7c75ca2ac8b2c01.png

Broker端,每个topic下的各个队列queue持久化后的消费进度数据
 

commitLog.putMessage()会有加锁释放锁的逻辑,因为要保证同一时间,只有一个线程去往MappedFile中写入消息数据

bae4b04d255a44d281106d223eb1a259.png

最新的NVME协议的SSD硬盘,磁盘存储:

文件写入速度,顺序读写 3g/s左右,随机读写2g/s左右(内存条的读写速度是10个g左右)

Broker端发送快速失败机制

f796df2008db42f297ab6da715b580dc.png

13941abfffb34bd2ae555c89854f8ab4.png

注意理解这个快速失败队列的好处

b2faa690ec6743189806766bff87c380.png

参考链接:RocketMQ 一行代码造成大量消息丢失

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com