存储系统概要设计
主要就是讲消息从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 一行代码造成大量消息丢失