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

一个好的文件系统,它的性能肯定是要优于分布式KV和newSQL;
Kafka和RocketMQ存储模型的差别

1. ConsumeQueue里面放的是一个个索引条目,索引条目有三个字段:CommitLogOffSet ,MessageSize、TagHashCode
2. doDispatch 异步线程 构建ConsumeQueue

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

发送模块业务架构

存储这块的设计很好,层次很清晰
存储逻辑层,比如CommitLog类中出了对外暴露putMessage()的接口外,还需要提供一些内部类,比如FlushRealTimeService这类的刷盘线程逻辑
存储IO层,则直接和PageCache、和磁盘打交道

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

消息写入模块



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

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

最新的NVME协议的SSD硬盘,磁盘存储:
文件写入速度,顺序读写 3g/s左右,随机读写2g/s左右(内存条的读写速度是10个g左右)
Broker端发送快速失败机制


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

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