對于生產者來說,將消息寫到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文件里面讀取到的。