RocketMQ深度百科全書式解析

?一、核心架構與設計哲學?

?1. 設計目標?

  • ?海量消息堆積?:單機支持百萬級消息堆積,適合大數據場景(如日志采集)。
  • ?嚴格順序性?:通過隊列分區(Queue)和消費鎖機制保證局部順序。
  • ?事務一致性?:獨創的 ??“半消息 + 事務狀態回查”?? 機制,解決分布式事務難題。

?2. 模塊協作原理?

  • ?Producer? → ?Broker?:
    消息發送時,Producer 根據 ?MessageQueueSelector? 選擇隊列(默認輪詢,可自定義哈希規則)。
  • ?Broker? → ?Consumer?:
    Consumer 使用 ?Pull API? 主動拉取消息,Broker 支持 ?長輪詢機制?(掛起請求直到有新消息)。
  • ?NameServer 動態發現?:
    Broker 每 ?30秒? 向所有 NameServer 注冊心跳,客戶端每 ?30秒? 拉取最新路由表。

?二、存儲引擎底層揭秘?

?1. CommitLog 的極致優化?

  • ?順序寫盤?:所有消息按到達順序追加寫入,磁盤吞吐達 ?600MB/s+??(對比隨機寫<2MB/s)。
  • ?內存映射加速?:使用 ?MappedByteBuffer? 將文件映射到內存,減少內核態拷貝。
  • ?文件切割策略?:
    單個 CommitLog 文件默認 ?1GB,寫滿后新建文件,文件名用 ?起始偏移量? 命名(如?00000000000000000000)。

?2. ConsumeQueue 索引構建?

  • ?異步構建線程?:ReputMessageService?實時解析 CommitLog,生成 ConsumeQueue 條目。
  • ?索引結構?:
    每個條目 ?20字節?(8B偏移量 + 4B消息大小 + 8B Tag Hash),單個文件保存 ?600萬條? 索引。
  • ?快速定位算法?:
    根據消費位點(offset)計算文件位置:(offset % totalSize) * 20

?3. 高性能背后黑科技?

  • ?PageCache 妙用?:利用操作系統緩存,消息寫入先到 PageCache,異步刷盤。
  • ?零拷貝技術?:Consumer 拉取消息時,通過?FileChannel.transferTo()?直接發送網卡,避免內存拷貝。

?三、高級特性源碼級剖析?

?1. 事務消息全流程?

// Producer 發送半消息
TransactionSendResult result = producer.sendMessageInTransaction(msg, null);// Broker 處理半消息(關鍵代碼)
if (msgType == MessageType.Trans_Msg_Half) {// 存入半消息 Topic(RMQ_SYS_TRANS_Half_TOPIC)putHalfMessage(queue);
}// 事務狀態回查(Broker 定時任務)
TransactionalMessageCheckService.check();

?2. 順序消息并發鎖?

  • ?隊列鎖機制?:
    Consumer 在消費時對隊列加鎖(lockMappedFile),確保同一隊列同一時刻僅一個線程消費。
  • ?重試策略?:
    消費失敗時,消息重試需保證回滾到原隊列(sendMessageBack?指定原隊列ID)。

?3. 延遲消息時間輪算法?

  • ?時間輪結構?:
    預設18個延遲級別(1s~2h),對應?SCHEDULE_TOPIC_XXXX?的不同隊列。
  • ?定時掃描線程?:
    ScheduleMessageService?每秒掃描時間輪,將到期消息投遞到目標 Topic。

?四、集群與高可用實戰手冊?

?1. 部署拓撲方案?

  • ?多 Master 多 Slave(異步復制)??:
    • 適用場景:高吞吐,允許秒級數據丟失(如日志采集)。
    • 配置示例:
      brokerRole=ASYNC_MASTER  
      flushDiskType=ASYNC_FLUSH  
  • ?多 Master 多 Slave(同步雙寫)??:
    • 適用場景:金融交易,零數據丟失。
    • 配置示例:
      brokerRole=SYNC_MASTER  
      flushDiskType=SYNC_FLUSH  

?2. 跨機房容災方案?

  • ?異步復制跨機房?:
    Master 部署在機房A,Slave 部署在機房B,通過專線異步復制。
  • ?雙主雙寫架構?:
    兩地各部署 Master,通過 ?Sharding? 將消息路由到不同機房(需應用層雙寫)。

?3. 擴容與縮容操作?

  • ?擴容 Broker?:
    1. 新機器部署 Broker,啟動時指定相同?brokerClusterName
    2. 通過?mqadmin updateTopic?將新 Broker 加入 Topic 隊列。
  • ?縮容 Broker?:
    1. 停止待下線 Broker。
    2. 執行?mqadmin wipeWritePerm?禁止新消息寫入。
    3. 等待消息消費完成后下線。

?五、性能調優黃金法則?

?1. 生產者調優?

  • ?批量發送?:
    List<Message> messages = new ArrayList<>(1000);
    // 填充消息...
    SendResult result = producer.send(messages);  
  • ?壓縮算法?:
    啟用 LZ4 或 ZSTD 壓縮(compressMsgBodyOverHowmuch=4096)。

?2. 消費者調優?

  • ?并發消費?:
    consumer.setConsumeThreadMin(20);  
    consumer.setConsumeThreadMax(64);  
  • ?批量拉取?:
    consumer.setPullBatchSize(32); // 每次拉32條  

?3. Broker 參數精調?

  • ?內存分配?:
    # 堆內存(建議4G以上)  
    JAVA_OPT="-Xms4g -Xmx4g -Xmn2g"  
    # 直接內存(映射文件用)  
    maxDirectMemorySize=2g  
  • ?網絡線程池?:
    # 發送消息線程數  
    sendMessageThreadPoolNums=24  
    # 拉取消息線程數  
    pullMessageThreadPoolNums=24  

?六、監控與運維實戰?

?1. 監控指標大盤?

  • ?核心指標?:
    • 寫入/消費 TPS
    • 消息堆積量(consumerOffset.json
    • CommitLog 磁盤使用率
  • ?工具集成?:
    • ?Prometheus + Grafana?:使用 RocketMQ Exporter 采集數據。
    • ?RocketMQ Dashboard?:官方控制臺,實時查看 Topic/Group 狀態。

?2. 日志分析技巧?

  • ?關鍵日志文件?:
    • ~/logs/rocketmqlogs/rocketmq_client.log:客戶端異常。
    • ~/logs/rocketmqlogs/store.log:存儲層錯誤。
  • ?日志關鍵字?:
    • [REJECTREQUEST]:系統過載,觸發流控。
    • [CLIENT_NOT_EXIST]:消費組未注冊。

?3. 故障應急工具箱?

  • ?重置消費位點?:
    mqadmin resetOffsetByTime -n localhost:9876 -g MyGroup -t MyTopic -s now  
  • ?強制刪除 Topic?:
    mqadmin deleteTopic -n localhost:9876 -c DefaultCluster -t MyTopic  

?七、真實場景案例庫?

?1. 電商訂單超時關單?

  • ?需求?:30分鐘未支付訂單自動關閉。
  • ?實現?:
    1. 訂單創建時發送 ?延遲消息?(Level=14對應30分鐘)。
    2. 消費者收到消息后檢查訂單狀態,執行關單邏輯。

?2. 廣告點擊實時統計?

  • ?需求?:實時統計每秒廣告點擊量,應對流量高峰。
  • ?實現?:
    1. 前端埋點發送點擊消息到 RocketMQ。
    2. Flink 消費消息,實時聚合寫入 Redis。

?3. 分布式事務:跨系統積分抵扣?

  • ?需求?:支付成功后,扣減用戶積分(積分系統獨立)。
  • ?實現?:
    1. 支付系統發送 ?事務消息?(半消息)。
    2. 執行本地事務(更新支付狀態),提交消息。
    3. 積分系統消費消息,執行積分扣減。

?八、RocketMQ 5.0 新特性全覽?

?1. 輕量級 Pop 消費模式?

  • ?特點?:無狀態消費,Broker 管理消費進度。
  • ?代碼示例?:
    SimpleConsumer consumer = new SimpleConsumer(...);  
    List<MessageExt> messages = consumer.receive(1000, 30);  

?2. 消息軌跡 2.0?

  • ?增強功能?:
    • 全鏈路追蹤(生產者IP → Broker存儲時間 → 消費者IP)。
    • 集成 OpenTelemetry,支持 Jaeger/SkyWalking。

?3. 多語言生態擴展?

  • ?支持語言?:Java、C++、Go、Python、Rust。
  • ?Go 客戶端示例?:
    producer, _ := rocketmq.NewProducer(...)  
    err := producer.SendSync(context.Background(), message)  

?九、避坑指南(血淚教訓)??

?1. 隊列數不足導致消費堆積?

  • ?現象?:Topic 隊列數=4,Consumer 實例=20 → 16個 Consumer 閑置。
  • ?解決?:隊列數 >= Consumer 實例數(建議隊列數=Consumer實例數*2)。

?2. 重復消費陷阱?

  • ?根因?:消費成功但 offset 提交失敗(如Consumer宕機)。
  • ?預防?:消費邏輯 ?冪等設計?(如數據庫唯一鍵)。

?3. 磁盤滿導致 Broker 掛死?

  • ?預防?:監控磁盤水位,設置?diskMaxUsedSpaceRatio=85
  • ?應急?:臨時清理過期 CommitLog(rm -rf ~/store/commitlog/00000000000000000000)。

?十、終極總結?
RocketMQ 是一個 ??“全場景消息中樞”?,既能扛住每秒百萬級消息洪峰(如雙11訂單),又能苛的事務一致性需求(如金融轉賬)。掌握其核心原理(存儲引擎、事務機制)和調優技巧(批量發送、隊列規劃),足以應對 90% 的分布式系統挑戰。記住,消息隊列不是銀彈,?合理設計生產消費模型,才是穩定性的終極保障! 🚀

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

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

相關文章

每日一題(小白)暴力娛樂篇19

樣例&#xff1a; 6 1 1 4 5 1 4 輸出&#xff1a; 56 66 52 44 54 64 分析題意可以得知&#xff0c;就是接收一串數字&#xff0c;將數字按照下標每次向右移動一位&#xff08;末尾循環到第一位&#xff09;&#xff0c;每次移動玩計算一下下標和數字的乘積且累加。 ①接收…

如何應對“最后時刻任務堆積”(鼓包現象)

應對“最后時刻任務堆積”&#xff08;鼓包現象&#xff09;的方法包括&#xff1a;合理規劃項目時間表、強化進度跟蹤管理、明確任務優先級、有效的資源配置、提升團隊溝通效率。其中&#xff0c;強化進度跟蹤管理尤為關鍵。根據項目管理協會&#xff08;PMI&#xff09;的調查…

19C-19.3環境-impdp導入到view時卡死

幫客戶導入一個用戶時&#xff0c;發現VIEW部分無法進行下去 Processing object type SCHEMA_EXPORT/TABLE/IDENTITY_COLUMN Processing object type SCHEMA_EXPORT/PACKAGE/PACKAGE_SPEC Processing object type SCHEMA_EXPORT/FUNCTION/FUNCTION Processing object type SCH…

一、簡單的 Django 服務

一、配置虛擬環境 1.1 創建一個文件夾在導航欄輸入cmd打開 1.2 安裝依賴兩個庫 pip install virtualenv virtualenvwrapper-win -i https://pypi.tuna.tsinghua.edu.cn/simple驗證是否安裝成功 virtualenv --version pip show virtualenvwrapper-win 1.3 創建虛擬環境 mkvi…

道路運輸安全員崗位事項有哪些?

道路運輸安全員的崗位事項主要包括以下幾個方面&#xff1a; 安全制度與計劃 參與制定和完善道路運輸企業的安全管理制度、安全操作規程等&#xff0c;確保各項安全工作有章可循。協助制定年度安全工作計劃和目標&#xff0c;并負責組織實施和監督執行情況&#xff0c;定期對…

瀟灑浪: Dify 上傳自定義文件去除內容校驗 File validation failed for file: re.json

Dify上傳文件 添加其他文件類型如 my.myselfsuffix 上傳成功 執行報錯 File validation failed for file: re.json 解決辦法 Notepad 搜索dify源碼 注釋掉&#xff0c;重啟容器 或者直接在容器中修改重啟

工作記錄 2015-08-24

工作記錄 2015-08-24 序號 工作 相關人員 1 更新76.19的D:\FNEHRRD&#xff0c;更新的差不多了&#xff0c;還在測試中。具體情況見附件。 郝 識別引擎監控 Ps (iCDA LOG :剔除了204篇ASG_BLANK之后的結果): LOG_File 20150823.txt BLANK_CDA/ALL 102/947 (10.8%) TIME…

Robot---SPLITTER行星探測機器人

1 背景 先給各位讀者朋友普及一個航天小知識&#xff0c;截止到目前為止&#xff0c;登陸火星的火星車有哪些&#xff1f;結果比較令人吃驚&#xff1a;當前只有美國和中國登陸過火星。 “勇氣”號&#xff08;Spirit&#xff09;&#xff1a;2004年1月4日&#xff0c;美國國家…

Python asyncio

一些Pre關鍵概念 asyncio 本質上還是單進程單線程的Python程序&#xff1b; 建立event_loop 概念&#xff0c;上面event_loop 可以理解為大腦&#xff0c;下面是若干個可執行的Task&#xff1b; Task 沒有控制權&#xff0c;沒有辦法控制event_loop 執行某個Task&#xff0c;只…

Dify什么?Dify 零門檻打造專屬 AI 應用

Dify 是一個專注于簡化大語言模型&#xff08;LLM&#xff09;應用開發的開源平臺&#xff0c;旨在幫助用戶通過可視化界面和模塊化工具快速構建、部署和管理 AI 驅動的應用程序。以下是其核心特點&#xff1a; 主要功能 可視化編排 提供直觀的界面&#xff0c;無需深入編碼即…

Hierarchical Reinforcement Learning for Course Recommendation in MOOCs論文閱讀

論文1簡介 標題&#xff1a;Hierarchical Reinforcement Learning for Course Recommendation in MOOCs 作者&#xff1a;Jing Zhang, Bowen Hao, Bo Chen, Cuiping Li, Hong Chen, Jimeng Sun 單位: 中國人民大學教育部數據工程與知識工程重點實驗室、 中國人民大學信息學院…

零基礎學Git

大家好&#xff01;最近跟著網上的課程看了一下git的課&#xff0c;淺淺地學了一下&#xff0c;以下內容為作為一個小白初識git的學習歷程和學習筆記&#xff01;&#xff01;&#xff01; 1.Git概述 1.1什么是Git? 分布式版本控制系統&#xff08;DVCS&#xff09;&#x…

算法 模版

cin cout加快讀取速度&#xff1a; ios::sync_with_stdio(false); 高精度*高精度 vector<int> mul(vector<int>& a, vector<int>& b) {vector<int>c(b.size()a.size()5,0);for (int i 0; i < a.size(); i) {for (int j 0; j < b.si…

4185 費馬小定理求逆元

4185 費馬小定理求逆元 ??難度&#xff1a;簡單 &#x1f31f;考點&#xff1a;費馬小定理 &#x1f4d6; &#x1f4da; import java.util.Scanner; import java.util.Arrays;public class Main {static int[][] a;public static void main(String[] args) {Scanner sc …

【SQL】常見SQL 行列轉換的方法匯總 - 精華版

【SQL】常見SQL 行列轉換的方法匯總 - 精華版 一、引言二、SQL常見的行列轉換對比1. 行轉列 Pivoting1.1 ??CASE WHEN 聚合函數??1.2 ??IF 聚合函數??1.3 ??PIVOT操作符?? 2.列轉行 Unpivoting2.1 UNION ALL??2.2 ??EXPLODE函數&#xff08;Hive/Spark&#…

操作系統 4.3-生磁盤的使用

磁盤的物理組成 盤面&#xff1a; 磁盤由多個盤面組成&#xff0c;每個盤面上都有數據存儲的區域。 磁道&#xff1a; 每個盤面上都有若干個同心圓&#xff0c;這些同心圓稱為磁道。磁道是數據存儲的路徑。 扇區&#xff1a; 磁道被進一步劃分為若干個扇區&#xff0c;扇區…

PT抽ETM如何包含power信息

在primetime中&#xff0c;可以使用extract_model -power指令使ETM包含power的信息。需要注意的是&#xff0c;需要先設置set power_enable_analysis為true。 例如得到有power信息的ETM指令如下&#xff08;示例&#xff09;&#xff1a; set power_enable_analysis true ex…

Linux服務器網卡深度解析:從ifconfig輸出到生產環境性能調優實戰

Linux服務器網卡深度解析&#xff1a;從ifconfig輸出到生產環境性能調優實戰 Linux服務器網卡深度解析&#xff1a;從ifconfig輸出到生產環境性能調優實戰一、背景二、生產環境的服務器部署情況三、拆解一個真實的 ifconfig 輸出1、先看 MAC 地址2、再看設備的 interrupt 和 me…

996引擎-源碼學習:PureMVC Lua 中的 Facade 類

996引擎-源碼學習:PureMVC Lua 中的 Facade 類 1. 核心概念1.1 外觀模式1.2 多例模式2. 關鍵組件NotificationController:ModelView3. 主要功能4. 初始化流程5. 通信機制6. 生命周期管理1. Facade 初始化流程圖2. 發送通知時序圖中介者 PlayerBestRingLayerMediatorOpenLayer …

鏈式多分支規則樹模型的應用

目錄 開始調用 初始化 歡迎關注我的博客&#xff01;26屆java選手&#xff0c;一起加油&#x1f498;&#x1f4a6;&#x1f468;?&#x1f393;&#x1f604;&#x1f602; 引入 最近在學習一個項目中的鏈式多分枝規則樹模型的使用&#xff0c;模型如下&#xff1a; 如圖所…