1.前言
此文章是在儒猿课程中的学习笔记,感兴趣的想看原来的课程可以去咨询儒猿课堂《从0开始带你成为RocketMQ高手》,我本人觉得这个作者还是不错,都是从场景来进行分析,感觉还是挺适合我这种小白的。这块主要都是我自己的学习笔记。想看原版的,还是去儒猿课堂。
这篇文章紧挨着上一篇文章:RokcetMQ中Producer的秘密-CSDN博客
2.Broker如何存储消息
前面我们已经大致了解到,Broker通过Netty网络服务器获取到一个请求,会将消息进行写入到一个CommitLog文件中,一个Broker上只有一个CommitLog文件,所有的Topic消息都会写入到一个CommitLog文件里。同时会以异步的方式将消息写入到MessageQueue中,因为一个Topic会有多个MessageQueue,一个MessageQueue其实就对应一个ConsumeQueue文件。于此同时还会异步将消息写入到IndexFile里,这个IndexFile里存储的就是每个消息的key和消息在CommitLog中的offset偏移量做一个索引。
我们来总结一下这个流程,
1.Broker收到消息之后,先写入到CommitLog日志文件中,这个CommitLog日志文件在磁盘目录是:${ROCKETMQ_HOME}/store/commitlog,这个目录下会有很多CommitLog日志文件,每个文件的默认大小是1G,一个文件写满了就会创建一个新的文件,文件名的话,就是文件中的第一偏移量,如果文件名不足20位就会用0来补齐。文件名如下所示:
00000000000000
00000000000124
在把消息写入到CommitLog文件的时候,就会申请PutMessageLock锁,这就意味着写入CommitLog日志的时候是串行的操作,不会让你进行并发写的。并发写的时候就会有数据错乱的问题。
2.接着就会对消息做出一通处理,包括设置消息的存储时间,创建全局唯一消息ID,计算消息的总长度,接着走一段关键的代码,将消息写入到MappedFile里。
3.总结
紧接着我们用一张图来总结下这篇博客的内容