【消息隊列RocketMQ】四、RocketMQ 存儲機制與性能優化

一、RocketMQ 存儲機制詳解

1.1 存儲文件結構?

RocketMQ 的存儲文件主要分布在store目錄下,該目錄是在broker.conf配置文件中通過storePathRootDir參數指定的,默認路徑為${user.home}/store 。主要包含以下幾種關鍵文件類型:?

????????1.1.1 CommitLog 文件:所有主題的消息都順序存儲在 CommitLog 文件中,它是 RocketMQ 消息存儲的核心。每個 CommitLog 文件默認大小為 1G,文件名以該文件創建時第一條消息的偏移量命名,如00000000000000000000。消息在 CommitLog 中以固定格式存儲,包含消息長度、CRC 校驗碼、消息體等信息。這種順序存儲方式極大地提高了磁盤的寫入性能。?

????????1.1.2 ConsumeQueue 文件:ConsumeQueue 是消息消費隊列的存儲文件,每個 Topic 的每個 Queue 都對應一個 ConsumeQueue 文件。它起到索引的作用,存儲了消息在 CommitLog 中的物理偏移量、消息大小、Tag 的哈希值等信息。通過 ConsumeQueue,Consumer 可以快速定位到消息在 CommitLog 中的位置,從而實現高效的消息拉取。ConsumeQueue 文件默認大小約為 600W 條消息,文件名同樣以偏移量命名。?

????????1.1.3 IndexFile 文件:IndexFile 用于實現消息的快速檢索,主要為了滿足根據消息 Key 或時間范圍查詢消息的需求。它存儲了消息的 Key、CommitLog 偏移量、時間戳等信息,并構建了 Hash 索引。每個 IndexFile 文件固定大小為 400M,文件名以創建時的時間戳命名。?

????????1.1.4 Checkpoint 文件:Checkpoint 文件記錄了 CommitLog、ConsumeQueue 和 IndexFile 的最后更新時間戳,用于 Broker 重啟時進行數據恢復,確保數據的一致性和完整性。?

????????1.1.5 Abort 文件:Abort 文件是一個標識文件,當 Broker 正常關閉時,該文件會被刪除;如果 Broker 異常退出,Abort 文件會保留,用于指示 Broker 下次啟動時需要進行數據恢復操作。?

1.2 消息寫入原理?

????????1.2.1 Producer 發送消息:Producer 將消息發送到 Broker,Broker 接收到消息后,首先會對消息進行校驗,如檢查消息大小、Topic 是否存在等。?

????????1.2.2 寫入 CommitLog:校驗通過后,消息會被順序寫入 CommitLog 文件。在寫入過程中,會為消息分配唯一的偏移量,同時計算 CRC 校驗碼,確保消息的完整性。由于 CommitLog 采用順序寫入,充分利用了磁盤的順序讀寫特性,大大提高了寫入效率。?

????????1.2.3 更新 ConsumeQueue:消息寫入 CommitLog 成功后,Broker 會根據消息所屬的 Topic 和 Queue,更新對應的 ConsumeQueue 文件。在 ConsumeQueue 中,記錄該消息在 CommitLog 中的偏移量等信息,為 Consumer 拉取消息提供索引。?

????????1.2.4 更新 IndexFile(可選):如果消息設置了 Key,Broker 會將消息的 Key、CommitLog 偏移量等信息寫入 IndexFile,構建 Hash 索引,以便后續根據 Key 進行快速查詢。?

1.3 消息讀取原理?

????????1.3.1 Consumer 請求消息:Consumer 向 Broker 發送拉取消息的請求,請求中包含 Topic、Queue 等信息。?

????????1.3.2 查詢 ConsumeQueue:Broker 接收到請求后,根據 Topic 和 Queue 找到對應的 ConsumeQueue 文件,從 ConsumeQueue 中讀取消息在 CommitLog 中的偏移量和消息大小等信息。?

????????1.3.3 讀取 CommitLog:根據 ConsumeQueue 中獲取的偏移量,從 CommitLog 文件中讀取完整的消息數據。在讀取過程中,會驗證 CRC 校驗碼,確保消息的正確性。?

????????1.3.4 返回消息給 Consumer:Broker 將讀取到的消息返回給 Consumer,Consumer 接收到消息后進行業務處理。

二、CentOS 7 下 RocketMQ 存儲相關配置?

2.1 配置文件修改?

在 CentOS 7 上,RocketMQ 的主要配置文件為broker.conf,位于 RocketMQ 安裝目錄的conf文件夾下。以下是一些與存儲相關的重要配置參數及其修改說明:

????????1、存儲路徑配置

storePathRootDir=/home/rocketmq/store
storePathCommitLog=/home/rocketmq/store/commitlog
storePathConsumeQueue=/home/rocketmq/store/consumequeue
storePathIndex=/home/rocketmq/store/index
storeCheckpoint=/home/rocketmq/store/checkpoint
abortFile=/home/rocketmq/store/abort

上述配置分別指定了 RocketMQ 各類存儲文件的根目錄、CommitLog 文件目錄、ConsumeQueue 文件目錄、IndexFile 文件目錄、Checkpoint 文件路徑以及 Abort 文件路徑。可根據實際磁盤空間和業務需求調整這些路徑,例如將存儲文件分散到不同的磁盤分區,以提高 I/O 性能。

????????2、刷盤機制配置

flushDiskType=ASYNC_FLUSH
# 或
# flushDiskType=SYNC_FLUSH

flushDiskType參數用于設置刷盤方式,有ASYNC_FLUSH(異步刷盤)和SYNC_FLUSH(同步刷盤)兩種模式。異步刷盤時,消息寫入內存后立即返回成功響應,由后臺線程定期將內存中的數據刷入磁盤,這種方式寫入性能高,但存在數據丟失風險;同步刷盤則是在消息寫入磁盤后才返回成功響應,保證了數據的可靠性,但會降低寫入性能。

? ? ? ? 3、文件大小配置

mapedFileSizeCommitLog=1073741824
mapedFileSizeConsumeQueue=30000000

mapedFileSizeCommitLog用于設置 CommitLog 文件的大小,默認值為 1G(1073741824 字節);mapedFileSizeConsumeQueue用于設置 ConsumeQueue 文件的大小,默認約為 30M(30000000 字節)。可根據實際業務量和磁盤空間調整這些參數,例如業務消息量較大時,適當增大 CommitLog 文件大小,減少文件切換頻率。

2.2 命令操作

????????1、查看存儲文件狀態:可通過查看store目錄下的文件及相關日志,了解存儲文件的狀態。例如,查看 CommitLog 文件的內容(不建議直接查看二進制文件,可通過日志輔助分析):

ls -l /home/rocketmq/store/commitlog

? ? ? ? 2、重啟 Broker 使配置生效:修改broker.conf配置文件后,需要重啟 Broker 才能使配置生效。先停止 Broker:

sh mqshutdown broker

再重新啟動 Broker:

nohup sh mqbroker -c conf/broker.conf &

三、RocketMQ 性能優化策略?

3.1 刷盤機制優化

????????1、根據業務場景選擇刷盤方式:對于可靠性要求極高的業務,如金融交易,應選擇SYNC_FLUSH同步刷盤方式,確保消息不丟失;對于對性能要求較高,可容忍一定數據丟失風險的業務,如日志記錄,可采用ASYNC_FLUSH異步刷盤方式,提升寫入性能。

? ? ? ? 2、調整異步刷盤參數:如果采用異步刷盤,可通過調整flushCommitLogLeastPages和flushCommitLogThoroughInterval參數優化刷盤性能。flushCommitLogLeastPages表示每次異步刷盤時,內存中至少積累的頁數(默認為 4 頁);flushCommitLogThoroughInterval表示強制刷盤的時間間隔(單位為毫秒,默認值為 1000 * 60 * 5,即 5 分鐘)。可根據實際業務量,適當減小flushCommitLogLeastPages,縮短flushCommitLogThoroughInterval,以提高數據刷盤的及時性。

3.2 文件存儲優化

? ? ? ? 1、合理設置文件大小:根據業務消息量和磁盤空間,合理調整 CommitLog 和 ConsumeQueue 文件的大小。避免文件過大導致查詢效率降低,或文件過小頻繁切換文件帶來的性能開銷。例如,對于消息量較小且消息生命周期較短的業務,可適當減小 ConsumeQueue 文件大小。

? ? ? ? 2、分散存儲路徑:將 CommitLog、ConsumeQueue、IndexFile 等存儲文件分散到不同的磁盤分區或物理磁盤上,減少 I/O 競爭,提高讀寫性能。在broker.conf中修改存儲路徑配置實現。

3.3 內存映射優化?

RocketMQ 采用內存映射(mmap)技術,將文件映射到內存中,減少數據在用戶態和內核態之間的拷貝,提高讀寫效率。可通過調整系統參數vm.max_map_count來優化內存映射性能。在 CentOS 7 上,使用以下命令臨時調整該參數:

sysctl -w vm.max_map_count=655300

如需永久生效,可修改/etc/sysctl.conf文件,添加或修改:

vm.max_map_count=655300

然后執行sysctl -p使配置生效。

3.4 其他優化措施?

????????1、負載均衡:合理配置 Producer 和 Consumer 的負載均衡策略,避免單個 Broker 負載過高。例如,Producer 可采用輪詢等方式將消息發送到不同的 Broker,Consumer 可根據消費能力動態分配消息隊列。?

????????2、定期清理過期數據:對于不再需要的消息,可通過設置消息的過期時間(在發送消息時設置maxTimeToLive參數),讓 Broker 自動清理過期數據,減少存儲壓力。

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

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

相關文章

C++入門小館: 探尋vector類

嘿,各位技術潮人!好久不見甚是想念。生活就像一場奇妙冒險,而編程就是那把超酷的萬能鑰匙。此刻,陽光灑在鍵盤上,靈感在指尖跳躍,讓我們拋開一切束縛,給平淡日子加點料,注入滿滿的pa…

CSS-跟隨圖片變化的背景色

CSS-跟隨圖片變化的背景色 獲取圖片的主要顏色并用于背景漸變需要安裝依賴 colorthief獲取圖片的主要顏色. 并丟給背景注意 getPalette并不是個異步方法 import styles from ./styles.less; import React, { useState } from react; import Colortheif from colorthief;cons…

RAGFlow:構建高效檢索增強生成流程的技術解析

引言 在當今信息爆炸的時代,如何從海量數據中快速準確地獲取所需信息并生成高質量內容已成為人工智能領域的重要挑戰。檢索增強生成(Retrieval-Augmented Generation, RAG)技術應運而生,它將信息檢索與大型語言模型(L…

SpringBoot應用:MyBatis的select語句如何返回數組類型

在SpringBoot應用中&#xff0c;比如想返回一個表的主鍵id構成的Long型數組Long[]&#xff0c;需要在XxxMapper.xml文件中這樣定義select語句&#xff1a; <select id"selectIds" parameterType"int" resultType"Long">select id from sy…

【HFP】藍牙HFP協議來電處理機制解析

目錄 一、協議概述與技術背景 1.1 HFP協議演進 1.2 核心角色定義 1.3 關鍵技術指標 二、來電接入的核心交互流程 2.1 基礎流程概述&#xff1a;AG 的 RING 通知機制 2.2 HF 的響應&#xff1a;本地提醒與信令交互 三、帶內鈴聲&#xff08;In-Band Ring Tone&#xff0…

【每天一個知識點】如何解決大模型幻覺(hallucination)問題?

解決大模型幻覺&#xff08;hallucination&#xff09;問題&#xff0c;需要從模型架構、訓練方式、推理機制和后處理策略多方面協同優化。 &#x1f9e0; 1. 引入 RAG 框架&#xff08;Retrieval-Augmented Generation&#xff09; 思路&#xff1a; 模型生成前先檢索知識庫中…

基于STC89C52RC和8X8點陣屏、獨立按鍵的小游戲《打磚塊》

目錄 系列文章目錄前言一、效果展示二、原理分析三、各模塊代碼1、8X8點陣屏2、獨立按鍵3、定時器04、定時器1 四、主函數總結 系列文章目錄 前言 用的是普中A2開發板&#xff0c;外設有&#xff1a;8X8LED點陣屏、獨立按鍵。 【單片機】STC89C52RC 【頻率】12T11.0592MHz 效…

C++學習:六個月從基礎到就業——C++學習之旅:STL迭代器系統

C學習&#xff1a;六個月從基礎到就業——C學習之旅&#xff1a;STL迭代器系統 本文是我C學習之旅系列的第二十四篇技術文章&#xff0c;也是第二階段"C進階特性"的第二篇&#xff0c;主要介紹C STL迭代器系統。查看完整系列目錄了解更多內容。 引言 在上一篇文章中…

leetcode刷題——判斷對稱二叉樹(C語言版)

題目描述&#xff1a; 示例 1&#xff1a; 輸入&#xff1a;root [6,7,7,8,9,9,8] 輸出&#xff1a;true 解釋&#xff1a;從圖中可看出樹是軸對稱的。 示例 2&#xff1a; 輸入&#xff1a;root [1,2,2,null,3,null,3] 輸出&#xff1a;false 解釋&#xff1a;從圖中可看出最…

無法右鍵下載文檔?網頁PDF下載方法大全

適用場景&#xff1a;繞過付費限制/無法右鍵下載/動態加載PDF 方法1&#xff1a;瀏覽器原生下載&#xff08;成功率60%&#xff09; Chrome/Edge&#xff1a; 在PDF預覽頁點擊工具欄 ??下載圖標&#xff08;右上角&#xff09; 快捷鍵&#xff1a;CtrlS → 保存類型選PDF …

基于缺失數據的2024年山東省專項債發行報告

一、數據情況 本次報告選取了山東省財政局公開的2024年專項債數據,共計2723條,發行期數是從第1期到第58期,由于網絡原因,其中25期到32期,54到57期的數據有缺失,如下圖所示。 從上圖看出,一年52周,平均每周都有一期發布,因此持續做專項債的謀劃很重要,一定要持續謀劃…

Ubuntu數據連接訪問崩潰問題

目錄 一、分析問題 1、崩潰問題本地調試gdb調試&#xff1a; 二、解決問題 1. 停止 MySQL 服務 2. 卸載 MySQL 相關包 3. 刪除 MySQL 數據目錄 4. 清理依賴和緩存 5.重新安裝mysql數據庫 6.創建程序需要的數據庫 三、驗證 1、動態庫更新了 2、頭文件更新了 3、重新…

Linux系統編程 day10 接著線程(中期頭大,還要寫論文)

線程有點懵逼 線程之前函數回顧以及總結部分&#xff08;對不清楚的問題再思考&#xff09; 線程控制原語 進程控制原語 pthread_create(); fork(); pthread_self(); getpid(); pthread_exit(); exit(); pthread_join(); …

《潯川AI翻譯v6.1.0問題已修復公告》

《潯川AI翻譯v6.1.0問題已修復公告》 尊敬的潯川AI翻譯用戶&#xff1a; 感謝您對潯川AI翻譯的支持與反饋&#xff01;我們已針對 **v6.1.0** 版本中用戶反饋的多個問題進行了全面修復&#xff0c;并優化了系統穩定性。以下是本次修復的主要內容&#xff1a; 已修復問題 ?…

深入理解 java synchronized 關鍵字

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家&#xff0c;歷代文學網&#xff08;PC端可以訪問&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移動端可微信小程序搜索“歷代文學”&#xff09;總架構師&#xff0c;15年工作經驗&#xff0c;…

華三(H3C)與華為(Huawei)設備配置IPsec VPN的詳細說明,涵蓋配置流程、參數設置及常見問題處理

以下是針對華三&#xff08;H3C&#xff09;與華為&#xff08;Huawei&#xff09;設備配置IPsec VPN的詳細說明&#xff0c;涵蓋配置流程、參數設置及常見問題處理&#xff1a; 一、華三&#xff08;H3C&#xff09;設備IPsec VPN配置詳解 1. 配置流程 華三IPsec VPN配置主要…

KBEngine 源代碼分析(一):pyscript 目錄文件介紹

pyscript 目錄文件 pyscript 目錄提供了 KBEngine 把 C++ 代碼中的類注冊到 Python 的機制 同時也提供了 C++ 調用 Python 方法的例子 相對現在的 C++ 17/20 ,這個目錄的分裝相對不優雅 不過不影響學習如何使用 Python 官方庫提供的 API ,實現 C++ Python 混合編程 C++ …

線程入門3

synchronized修飾方法 synchronized可以修飾代碼塊(在線程入門2中有例子)&#xff0c;也可以修飾普通方法和靜態方法。 修飾普通方法 修飾普通方法簡化寫法&#xff1a; 修飾靜態方法 修飾靜態方法簡化寫法&#xff1a; 注意&#xff1a;利用synchronized上鎖&#xff0c;鎖的…

linux上Flexlm命令

FlexLM 是一種靈活的許可證管理系統&#xff0c;廣泛用于各種軟件產品中&#xff0c;如 Autodesk 的 AutoCAD 和 Autodesk 的其他產品。它允許軟件開發商控制軟件的使用和分發&#xff0c;同時提供靈活的許可證管理策略。在 Linux 系統中使用 FlexLM 通常涉及到幾個關鍵步驟&am…

【Java學習方法】終止循環的關鍵字

終止循環的關鍵字 一、break 作用&#xff1a;跳出最近的循環&#xff08;直接結束離break最近的那層循環&#xff09; 使用場景&#xff1a;一般搭配if條件判斷&#xff0c;如果滿足某個條件&#xff0c;就結束循環&#xff0c;&#xff08;場景&#xff1a;常見于暴力枚舉中…