91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

RocketMQ存儲中如何實現日志文件創建與映射

發布時間:2021-11-18 09:38:37 來源:億速云 閱讀:136 作者:小新 欄目:大數據

這篇文章將為大家詳細講解有關RocketMQ存儲中如何實現日志文件創建與映射,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

1.問題描述

日志目錄(可配置)/data/rocketmq/store/commitlog會有20位長度的日志文件。
1.日志文件什么時候創建的?
2.日志文件創建流程是什么?
3.日志文件和內存映射是怎么樣的?

-rw-rw-r-- 1 baseuser baseuser 1073741824 Jun 27 22:50 00000117290188144640
-rw-rw-r-- 1 baseuser baseuser 1073741824 Jun 27 22:52 00000117291261886464
-rw-rw-r-- 1 baseuser baseuser 1073741824 Jun 27 22:54 00000117292335628288
-rw-rw-r-- 1 baseuser baseuser 1073741824 Jun 27 22:56 00000117293409370112
-rw-rw-r-- 1 baseuser baseuser 1073741824 Jun 27 22:57 00000117294483111936
-rw-rw-r-- 1 baseuser baseuser 1073741824 Jun 27 22:56 00000117295556853760
2.日志映射相關類初始化

在Broker啟動時實例化了兩個類DefaultMessageStore和AllocateMappedFileService。
AllocateMappedFileService是線程類繼承了Runnable接口,該線程類持有DefaultMessageStore的引用(即:可操作管理DefaultMessageStore),并啟動該線程類。
調用鏈

//Broker啟動時調用
@1 BrokerStartup#main#createBrokerController()
boolean initResult = controller.initialize();
@2 Controller#initialize()
this.messageStore = new DefaultMessageStore(this.messageStoreConfig, this.brokerStatsManager, this.messageArrivingListener, this.brokerConfig);
@3 DefaultMessageStore#DefaultMessageStore()
//將DefaultMessageStore自身引用傳給AllocateMappedFileService
this.allocateMappedFileService = new AllocateMappedFileService(this);
this.allocateMappedFileService.start();//啟動該線程類
@4 class AllocateMappedFileService extends ServiceThread
public AllocateMappedFileService(DefaultMessageStore messageStore) {
this.messageStore = messageStore;
}
3.線程類一直運行在干啥

既然在Broker啟動時該線程類AllocateMappedFileService就啟動了,那么在做什么呢?run方法為while循環,即:只要服務不停止并且mmapOperation()返回true則一直運行

//異步處理,調用mmapOperation完成請求的處理
public void run() {
log.info(this.getServiceName() + " service started");
//while循環,只要服務部停止即調用 mmapOperation方法
while (!this.isStopped() && this.mmapOperation()) {
}
log.info(this.getServiceName() + " service end");
}

mmapOperation方法流程圖

RocketMQ存儲中如何實現日志文件創建與映射

小結:mmapOperation方法主要做了兩件事:初始化MappedFile和預熱MappedFile。只要服務不停止和線程不被中斷,這個過程一直重復運行。

4.提交映射文件請求(AllocateRequest)

既然AllocateMappedFileService一直從容器(優先級隊列和ConcurrentHashMap)中獲取AllocateRequest。AllocateRequest是什么時候產生并放到容器中的呢?
RocketMQ消息存儲概覽【源碼筆記】中寫入commitLog流程,獲取最新的日志文件。
調用鏈

@1 CommitLog#putMessage
//文件已滿或者沒有映射文件重新創建一個文件
if (null == mappedFile || mappedFile.isFull()) {
mappedFile = this.mappedFileQueue.getLastMappedFile(0);
// Mark: NewFile may be cause noise
}
@2 MappedFileQueue#getLastMappedFile

流程圖

RocketMQ存儲中如何實現日志文件創建與映射

小結:MappedFileQueue#getLastMappedFile會向線程類AllocateMappedFileServic提交兩個映射文件創建請求:分別為nextFilePath和nextNextFilePath;如果線程類AllocateMappedFileServic為null,則直接new一個MappedFile,此時只會創建一個文件。

下面為提交兩個映射文件請求流程,即:

AllocateMappedFileServic#putRequestAndReturnMappedFile


調用鏈

@1 MappedFileQueue#getLastMappedFile
if (this.allocateMappedFileService != null) {
mappedFile = this.allocateMappedFileService.putRequestAndReturnMappedFile(nextFilePath,
nextNextFilePath, this.mappedFileSize);
}
@2 AllocateMappedFileService#putRequestAndReturnMappedFile

流程圖

RocketMQ存儲中如何實現日志文件創建與映射

小結:處理提交的映射文件請求指的是:
實例化兩個AllocateRequest并把他們提交到requestTable(ConcurrentHashMap)
和requestQueue(PriorityBlockingQueue)中,等待5秒,此段時間線程會從這兩個容器中獲取請求并創建MappedFile,并將結果返回。

5.MappedFile初始化

本段梳理下上文中mmapOperation方法流程圖第5步初始化MappedFile的流程
調用鏈

@1 AllocateMappedFileService#mmapOperation
mappedFile = new MappedFile(req.getFilePath(), req.getFileSize());
@2 MappedFile#init(fileName, fileSize);

流程圖

RocketMQ存儲中如何實現日志文件創建與映射

MappedFile主要干了兩件事:1.創建日志文件。2.并將文件映射到內存中。

關于“RocketMQ存儲中如何實現日志文件創建與映射”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

丰城市| 庆元县| 唐山市| 中卫市| 南涧| 高平市| 江川县| 阳谷县| 淮北市| 天峨县| 镇坪县| 盐池县| 米脂县| 那曲县| 望城县| 平原县| 锡林郭勒盟| 景东| 浦县| 江城| 云安县| 东兰县| 正蓝旗| 法库县| 林芝县| 白玉县| 南靖县| 子长县| 武隆县| 汽车| 墨脱县| 泰州市| 将乐县| 惠东县| 封开县| 封丘县| 贵港市| 防城港市| 凤庆县| 江城| 临安市|