RocketMQ源碼級實現原理-Commitlog刷盤機制

刷盤機制

467701cf74cc4743b0b5224e08de5548.png

81579fa4cbf3485289c5b64f74ef7d4f.png

同步刷盤

4cf3d13731154dfaa7752a12f0b56c32.png

代碼實現

寫入線程

寫入線程可能同時有多個,但是刷盤線程至始至終就是一個單線程

刷盤線程,始終是操作雙緩沖區域,一個用來刷盤,另一個用來接收多個寫入線程同時寫入刷盤請求

刷盤線程

通過這種方式,實現一次flush操作,能把多個寫入線程同時寫入到MappedFile中的多條消息,一次性的刷入磁盤,也就是實現了“批量刷盤”的效果

異步刷盤

fad5acb97f114655a4ef3e4f3ecbf99a.png

5b18ca5fbb8c4c62b05de4aefab35726.png

這里一共有三種線程,FlushRealTimeService,CommitRealTimeService,broker寫入主線程。CommitLog這個類負責來協調這三種線程,這三種線程溝通的橋梁,就是MappedFileQueue中的lastMappedFile。

broker寫入主線程,和CommitRealTimeService負責往橋梁中寫入消息并喚醒FlushRealTimeService線程,而FlushRealTimeService線程被前面兩個線程喚醒后,就去將橋梁中新寫入的消息flush到磁盤上去。

三個線程具體是如何協調的:

開啟了堆外內存后,broker寫入主線程會把消息寫入到從堆外內存池借來的byteBuffer中,再由CommitRealTimeService線程,通過當前要寫入的MappedFile的fileChannel字段,調用fileChannel.write(byteBuffer)來將byteBuffer中的消息,寫入PageCache。CommitRealTimeService寫入完成后,就調用FlushRealTimeService#wakeup()喚醒FlushRealTimeService線程,FlushRealTimeService線程,最后去將橋梁中新寫入的消息flush到磁盤上去。

沒開啟堆外內存時,broker寫入主線程會直接把消息寫入到當前MappedFile的mappedByteBuffer字段中(也就是直接寫入了PageCache中)。寫入完成后,broker寫入主線程就調用FlushRealTimeService#wakeup()喚醒FlushRealTimeService線程,FlushRealTimeService線程,最后去將橋梁中新寫入的消息flush到磁盤上去。

一般有兩種,有兩種方式進行讀寫
(1)第一種,Mmap+PageCache的方式,讀寫消息都走的是pageCache,這樣子讀寫都在pagecache里面不可避免會有鎖的問題,在并發的讀寫操作情況下,會出現缺頁中斷降低,內存加鎖,污染頁的回寫。
(2)第二種,DirectByteBuffer(堆外內存)+PageCache的兩層架構方式,這樣子可以實現讀寫消息分離,寫入消息時候寫到的是DirectByteBuffer——堆外內存中,讀消息走的是PageCache(對于DirectByteBuffer是兩步刷盤,一步是刷到PageCache,還有一步是刷到磁盤文件中),帶來的好處就是,避免了內存操作的很多容易堵的地方,降低了時延,比如說缺頁中斷降低,內存加鎖,污染頁的回寫。

視頻地址:04-RocketMQ刷盤機制_嗶哩嗶哩_bilibili

面試題部分

頭條面試:RocketMQ為何默認使用mmap,并且可配置成FileChannel異步發送消息

注意上面mmap的方式就一個參數,每500ms,將pagecache中的數據刷入磁盤一次

fileChannel的方式有三個參數,200ms從堆外內存刷到pagecache一次、200ms或者4個pagecache頁滿了就從pagecache刷入磁盤一次

兩種方式從寫入速度上進行的對比

因為rocketmq從最開始就是定位為業務處理MQ,大多數時候都是發送小數據,所以rocketmq默認就是使用的mmap的方式。但是rocketmq也借鑒并保留了kafka的方式的fileChannel的方式,因為kafka只要用在大數據場景

s

視頻地址:頭條面試:RocketMQ為何默認使用mmap,并且可配置成FileChannel異步發送消息_嗶哩嗶哩_bilibili

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/89445.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/89445.shtml
英文地址,請注明出處:http://en.pswp.cn/web/89445.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java與Vue技術搭建的SRM招標采購管理系統,提供源碼,涵蓋招標、投標、評標全流程,助力企業高效規范采購管理

前言:在當今競爭激烈的商業環境中,高效、透明、規范的招標采購流程對于企業的成本控制、供應鏈穩定以及整體運營效率至關重要。SRM招標采購管理系統應運而生,它借助先進的信息技術,整合了招標采購的各個環節,實現了采購…

Kotlin集合分組

集合的分組(Grouping) 在之前的學習中,我們已經學會了如何對集合進行過濾、排序或執行聚合操作。 在本節中,我們將學習如何對集合元素進行分組,以便以最適合我們任務的方式呈現信息。分組(Grouping&#xf…

阿里云ssh證書過期,如果更換并上傳到服務器

登錄阿里云平臺,在控制臺中找到“數字證書管理服務”進入頻道后,選擇“SSL證書管理”點擊“創建證書”,創建成功后,進入證書詳情頁選擇“下載”板塊,根據自身服務器類型,下載相應的證書即可服務器更新證書登…

【軟件系統架構】系列七:系統性能——計算機性能深入解析

目錄 一、什么是計算機性能? 二、計算機性能核心指標 1. CPU性能指標 2. 內存性能指標 3. 存儲子系統性能 4. 網絡性能指標 5. 系統資源使用與并發能力 三、性能瓶頸分析方法 四、計算機性能評測與對比 常見性能測試指標與工具: 五、計算機性…

基于現代R語言【Tidyverse、Tidymodel】的機器學習方法

機器學習已經成為繼理論、實驗和數值計算之后的科研“第四范式”,是發現新規律,總結和分析實驗結果的利器。機器學習涉及的理論和方法繁多,編程相當復雜,一直是阻礙機器學習大范圍應用的主要困難之一,由此誕生了Python…

Python暑期學習筆記5

時間:2025.7.18學習內容:【語法基礎】while循環與循環嵌套一、循環語句循環流程圖二、while循環基本格式:while條件:循環體(條件滿足時段做的事情)改變變量死循環while True:循環體(要循環做的事…

world models and Human–Object Interaction (HOI)

Author: Chatgpt Here are several key research papers that explore the intersection of world models and Human–Object Interaction (HOI)—especially ones that build structured, object-centric representations from videos or use world-model-based learning to p…

無人值守共享自習室物聯系統安全防線:從設備到數據的全面防護策略!

在“全民學習”浪潮的推動下,無人值守共享自習室憑借24小時開放、靈活預約和沉浸式體驗,已成為城市學習空間的新形態。而當人力值守被物聯網設備替代后,安全風險卻從物理世界延伸到了數字世界。一套完整的自習室物聯網系統包含門禁、傳感器、…

【27】MFC入門到精通——MFC 修改用戶界面登錄IP IP Address Control

界面搭建 將【IP Address Control】控件,【Edit Control】控件和兩個【button】控件分別拖入主界面 將ID分別修改為:IDC_IP_ADDRESS IDC_IPADDRESS_EDIT IDC_GET_BUTTON IDC_CLEAN_BUTTON添加變量 為【IP Address Control】控件添加變量【m_IPaddress】&…

MacOS安裝linux虛擬機

在學習docker時用的云環境本身就是一個容器,啟動docker總是各種問題,所以直接在本機上裝一個虛擬機。 當前系統環境: 安裝虛擬機軟件 安裝UTM 下載官網:https://mac.getutm.app/ uname -m查看一下指令架構,下載…

TimSort:論Java Arrays.sort的穩定性

TimSort 是一種混合的、穩定的排序算法,結合了歸并排序(Merge Sort)和二分插入排序(Binary Insertion Sort)的優點,尤其適用于部分有序的數據。在 Java 中,Arrays.sort() 對對象數組排序時內部使…

企業數據生命周期安全架構設計

數據是企業的生命線,而安全則是這條生命線的保護神。今天我們就來聊聊如何為企業數據的一生一世構建一套堅不可摧的安全防護體系。 📚 文章目錄 為什么需要數據生命周期安全架構數據生命周期全景圖安全架構設計的核心原則各階段安全防護策略整體安全架構…

【Java】字符串常量池

文章目錄一.字符串常量池(StringTable)1.1 定義1.2 演示示例1.3 intern方法一.字符串常量池(StringTable) 1.1 定義 字符串常量詞本質是一個固定大小的HashTable。當用一個字符串構造String對象時,首先會去StringTable中查看是否存在在字符串,如果存在…

數據通信與計算機網絡——模擬傳輸

主要內容數字到模擬轉換幅移鍵控ASK頻移鍵控FSK相移鍵控PSK正交振幅調制QAM模擬信號調制調幅AM調頻FM調相PM一、數字到模擬轉換數字信號需要低通通道,如果現實應用中只有帶通通道,只能選擇模擬信號進行傳輸。將數字數據轉換為帶通模擬信號,傳…

如何用Python并發下載?深入解析concurrent.futures 與期物機制

concurrent.futures模塊的核心價值 Python的concurrent.futures模塊提供了線程池(ThreadPoolExecutor)和進程池(ProcessPoolExecutor)兩種并發模型,通過高層接口簡化并發編程。其核心優勢在于: 自動管理資源…

MMKV 存儲json list數據(kotlin)

1、添加依賴與初始化 首先在 build.gradle 中添加 MMKV 依賴: implementationcom.tencent:mmkv:1.2.12 在 Application 類中初始化 MMKV: import android.app.Application import com.tencent.mmkv.MMKVclass MyApp : Application() { override fun onCreate() { super.o…

C++ -- STL-- stack and queue

////// 歡迎來到 aramae 的博客,愿 Bug 遠離,好運常伴! ////// 博主的Gitee地址:阿拉美 (aramae) - Gitee.com 時代不會辜負長期主義者,愿每一個努力的人都能達到理想的彼岸。1. stack的介紹和使用 2. queue的介紹…

信息論至AI實踐:交叉熵的原理全景與應用深度解析

1 定義與數學原理:從信息論到分布差異度量 交叉熵(Cross Entropy)是信息論中用于量化兩個概率分布差異的核心概念,由Claude Shannon的信息論發展而來。它測量了在相同事件集合上,使用估計的概率分布q對服從真實概率分…

WAF 能防御哪些攻擊?

WAF(Web 應用防火墻)是網站和Web應用的安全守門人,但很多用戶對其具體防御范圍一知半解。實際上,WAF 能針對性攔截多種網絡攻擊,從常見的注入攻擊到復雜的惡意爬蟲,覆蓋Web安全的核心威脅。本文詳解WAF的防…

閑庭信步使用圖像驗證平臺加速FPGA的開發:第二十二課——圖像直方圖統計的FPGA實現

(本系列只需要modelsim即可完成數字圖像的處理,每個工程都搭建了全自動化的仿真環境,只需要雙擊top_tb.bat文件就可以完成整個的仿真,大大降低了初學者的門檻!!!!如需要該系列的工程…