对于生产者来说,将消息写到commit log文件里面。这里会有消息的逻辑队列,逻辑队列里面保存了消息的偏移量。
除了consumerquenue之外,它还会将数据分发到另外一个文件叫indexfile索引文件里面。
这个索引文件可以保存消息的一些信息,比如物理的偏移量,消息的键,消息的头。然后还可以通过hash找到消息的位置。
这里面有个非常关键点叫做时间戳。在timestamp时间戳里面,之前在聊kafka的时候说过,kafka也可以根据某个时间点来找到某个消息的偏移量,Rocketmq也具备这种能力。
可以根据某个时间点来找到这个偏移量,在另外一个索引文件IndexFile里面提供了可以搜索数据的地方。
IndexFile
真正的数据是保存在commit log里面
#commitLog存储路径
storePathCommitLog=/usr/local/rocketmq/broker-a-master/store/commitlog[root@localhost commitlog]# ls
00000000000000000000
如果所有的操作都在访问00000000000000000000这样的数据文件,它的性能会有一些影响。
为了解决这个问题Rocketmq做了一些提升。虽然这部分是磁盘文件,但是Rocketmq使用了顺序的读写使用了页缓存的概念,使用了0拷贝相关的技术让Rocketmq在读这个文件的性能上面也可以做到非常快。
页缓存与内存映射
⻚缓存(PageCache)是OS对⽂件的缓存,⽤于加速对⽂件的读写。⼀般来说,程序对⽂件进⾏顺序读写的速度⼏乎接近于内存的读写速度,主要原因就是由于OS使⽤PageCache机制对读写访问操作进⾏了性能优化,将⼀部分的内存⽤作PageCache。对于数据的写⼊,OS会先写⼊⾄Cache内,随后通过异步的⽅式由pdflush内核线程将Cache内的数据刷盘⾄物理磁盘上。对于数据的读取,如果⼀次读取⽂件时出现未命中PageCache的情况,OS从物理磁盘上访问读取⽂件的同时,会顺序对其他相邻块的数据⽂件进⾏预读取。
[root@localhost store]# ls -l
total 8
-rw-r--r--. 1 root root 0 Sep 18 2024 abort
-rw-r--r--. 1 root root 4096 Aug 17 15:49 checkpoint
drwxr-xr-x. 2 root root 34 Sep 27 2024 commitlog
drwxr-xr-x. 2 root root 246 Aug 17 15:50 config
drwxr-xr-x. 3 root root 23 Sep 22 2024 consumequeue
drwxr-xr-x. 2 root root 31 Nov 24 2024 index
-rw-r--r--. 1 root root 4 Nov 24 2024 lock
abort文件,这个abort文件大小是0,当broker启动的时候会去创建这个abort文件。当broker在正常关闭的时候,abort文件会被删除掉。
当broker在启动的时候发现在store里面有这个abort文件,那么意味着上一次是非正常关闭,所以会配有相应的机制去做一些偏移量,配置的检查。所以这是abort文件的一些作用。
config文件下面的json文件,比如topic的信息会被保存到topics文件里面。比如topics是用来保存topic的一些信息。
在控制台展示的数据其实也是从这些json文件里面读取到的。