RocketMQ 架構

一、RocketMQ 核心架構概述

在這里插入圖片描述

?1. 主要組件

?Name Server: 集群的「中樞神經」,負責 Topic 元數據管理(如 Topic 分區分布、Broker 節點狀態監控)。
?Broker: 消息存儲與流轉的核心節點,負責消息的持久化、讀寫請求處理。
?Producer: 消息生產者,負責將消息投遞到指定的 Topic。
?Consumer: 消息消費者,從 Broker 拉取消息并處理。

?2. 集群部署模式

?Name Server 集群: 通常部署 2-3 個節點,通過 ?Raft 協議實現高可用,保障元數據一致性。
?Broker 集群: 至少部署 2 個 Broker(主從或異步復制),支持橫向擴展,每個 Broker 可管理多個 Partition。

?二、Partition 分區機制

?1. 設計目的

?水平擴展: 通過增加 Partition 數量提升并行處理能力。
?負載均衡: 消費者可以分散到不同 Partition 消費,避免單點瓶頸。
?順序性保障: 單個 Partition 內的消息按生產順序嚴格遞增,滿足事務性場景需求。

?2. 實現細節

?Topic 與 Partition:
每個 Topic 可劃分為多個 ?Ordered Partition?(順序分區)和 ?Unordered Partition?(無序分區)。
默認情況下為 Ordered Partition,需顯式配置 unordered=true 啟用無序模式。
?分區分配策略:
?Hash 分布:根據 Message Key 的哈希值均勻分配到各個 Partition。
?Round Robin:無 Key 時輪詢分配,適用于廣播場景。
?數據存儲:
每個 Partition 對應一個 ?CommitLog?(提交日志),所有消息按順序追加寫入。
?IndexFile:索引文件,記錄消息在 CommitLog 中的物理偏移量,加速隨機讀取。

?3. 示例場景

Topic: ORDER_EVENT (4 Partitions)
Partition 0: 消息 1,3,5,7...
Partition 1: 消息 2,4,6,8...
Partition 2: 消息 9,11,13...
Partition 3: 消息 10,12,14...

三、不丟消息的實現機制

1. 持久化保障

?CommitLog 設計:
所有消息先寫入 CommitLog,順序追加保證原子性。
?刷盤策略: 支持同步刷盤(SyncFlush)和異步刷盤(AsyncFlush)。
?同步刷盤: 寫入 CommitLog 后立即刷盤到磁盤(默認),犧牲性能換取零數據丟失。
?異步刷盤: 周期性批量刷盤,提升吞吐但存在極小丟數據風險(可配置 flushDiskType)。
?多副本機制:
?同步復制(SyncReplicate)?: 主 Broker 寫入成功后,至少等待一個從 Broker 復制確認才返回生產者(default)。
?異步復制(AsyncReplicate)?: 主 Broker 立即返回,從 Broker 異步同步(適用于對一致性要求低的場景)。

2. 生產者端可靠性

?重試與冪等性:
生產者發送消息失敗后自動重試(maxRetryTimes 配置)。
支持冪等消息(通過 MessageId 或 SequenceId 避免重復消費)。
?事務消息:
通過 ?本地事務 + RocketMQ 事務消息 實現最終一致性(如訂單扣減與消息發送原子性)。

?3. 消費者端可靠性

?ACK 機制:
消費者拉取消息后需手動提交 Offset(enableAutoCommit=false 關閉自動提交)。
?消費失敗重試:結合 RetryPolicy 實現自動重試或死信隊列處理。
?Exactly-Once 語義:
通過 ?事務消息 + 消費者 Offset 管理 實現精確一次消費(如支付成功后消息不重復)。

4. 監控與告警

?Broker 監控: 監控磁盤使用率、網絡延遲、請求堆積等指標,觸發異常告警。
?SLA 策略: 配置副本同步超時時間(replicaSyncTimeoutMs),超時節點自動隔離。

?四、讀寫性能優化

?1. 寫入性能優化

?批量壓縮:
啟用 compressEnable=true 和 compressAlgorithm=lz4,減少網絡傳輸和磁盤占用。
?適用場景:文本類消息(如 JSON)壓縮率可達 50%+。
?零拷貝技術:
?Netty 零拷貝:直接操作 ByteBuf,避免數據在 Java 內存與 Native 內存間多次拷貝。
?文件通道:通過 MappedByteBuffer 直接映射磁盤文件,提升 IO 效率。
?多線程寫入:
Broker 使用 ?多線程模型?(默認 16 個線程)處理生產者請求,充分利用 CPU 資源。

?2. 讀取性能優化

?批量拉取:
消費者單次拉取消息數量可配置(pullBatchSize),減少網絡 round trip。
?多消費者并行消費:
同一 Partition 的多個消費者實例通過 ?Consumer Group 并行消費,提升吞吐量。
?索引加速:
?IndexFile 二分查找消息 Offset,將隨機讀取復雜度從 O(n) 降至 O(log n)。

3. 網絡與存儲優化

?TCP 協議優化:
使用 ?長連接 減少握手開銷,啟用 tcpNoDelay=true 禁用 Nagle 算法。
?SSD 存儲:
Broker 數據盤部署 SSD,對比 HDD,IO 延遲降低 5-10 倍。
?分區策略優化:
根據負載動態擴容 Partition(需結合客戶端版本支持)。

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

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

相關文章

單片機學完開發板,如何繼續提升自己的技能?

很多人學完開發板后都會卡在一個尷尬的階段:覺得自己會的東西不少,但又不知道下一步該干啥。會點C語言,能燒錄程序,能點亮LED,玩轉按鍵,搞定串口等等,能用開發板做點小玩意兒,但面對…

olmOCR大模型:支持結構化精準提取復雜PDF文件內容

基于streamlit與olmOCR大模型實現的pdf提取工具 import os import json import subprocess import pandas as pd from pathlib import Path import shutil import time import re import streamlit as st# 創建工作目錄 WORKSPACE_DIR "olmocr_workspace" os.maked…

五模型對比!Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多變量時間序列預測

目錄 預測效果基本介紹程序設計參考資料 預測效果 基本介紹 光伏功率預測!五模型對比!Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多變量時間序列預測(Matlab2023b 多輸入單輸出) 1.程序已經調試好,替換數據集后,僅運…

druid開啟防火墻之后的bug

bug以及解決方案 不允許執行多個語句不允許有注釋部分數據有誤識別,拋出異常,導致原本正常執行的語句被中斷 解決方案 application.yaml中對于druid配置如下: wall:enabled: true # 開啟防火墻config:multi-statement-allow: true # 允許多個…

SQLMesh 系列教程:Airbnb數據分析項目實戰

在本文中,我們將探討如何利用dbt項目的代碼庫來實現一個簡單的SQLMesh項目。本文的基礎是基于Udemy講師為dbt課程創建的示例項目,可以在這個GitHub repo中獲得。這個dbt項目是相對完整的示例,我們將使用它作為模板來演示SQLMesh(下…

單片機寫的小液晶屏驅動+漢字滾屏

單片機寫的小液晶屏驅動漢字滾屏 stm32f401freertos內置HZK16 單片機漢字滾屏

【Golang那些事】go1.22和1.23 更新重點及測評

好久沒有寫文章了,攢了一年的Golang版本特性的技術點以及踩過的坑,那就在新年第一篇的文章中做一個總結吧: 一、關于迭代器 (一)迭代器去掉了共享共享內存 一個經典的面試題 說到Golang經典的面試題,大家可能都刷到過很多&…

python力扣438.找到字符串中所有字母異位詞

給定兩個字符串 s 和 p,找到 s 中所有 p 的 異位詞的子串,返回這些子串的起始索引。不考慮答案輸出的順序。 示例 1: 輸入: s “cbaebabacd”, p “abc” 輸出: [0,6] 解釋: 起始索引等于 0 的子串是 “cba”, 它是"abc" 的異位詞。 起始索引…

【大模型實戰篇】使用GPTQ量化QwQ-32B微調后的推理模型

1. 量化背景 之所以做量化,就是希望在現有的硬件條件下,提升性能。量化能將模型權重從高精度(如FP32)轉換為低精度(如INT8/FP16),內存占用可減少50%~75%。低精度運算(如INT8&#xf…

【MySQL】架構

MySQL架構 和其它數據庫相比,MySQL有點與眾不同,它的架構可以在多種不同場景中應用并發揮良好作用。主要體現在存儲引擎的架構上,插件式的存儲引擎架構將查詢處理和其它的系統任務以及數據的存儲提取相分離。這種架構可以根據業務的需求和實…

JavaScript 金額運算精度丟失問題及解決方案

JavaScript 金額運算精度丟失問題及解決方案 1. 前言2. 為什么 JavaScript 計算金額會精度丟失?2.1 JavaScript 使用 IEEE 754 雙精度浮點數2.2 浮點運算錯誤示例**錯誤示例 1:0.1 0.2 ≠ 0.3****錯誤示例 2:浮點乘法精度問題** 3. 解決方案…

Docker安裝,并pullMySQL和redis

卸載原Docker 您的 Linux 發行版可能提供非官方的 Docker 軟件包,這可能與 Docker 提供的官方軟件包沖突。在安裝 Docker Engine 正式版之前,您必須先卸載這些軟件包。 sudo dnf remove docker \ docker-client \ docker-client-latest \ docker-common…

國內首臺太空采礦機器人亮相,宇宙資源開發邁入新階段

隨著地球資源的日益枯竭,人類將目光投向了浩瀚的宇宙。太空采礦作為一項前沿科技,正逐步從科幻走向現實。近日,中國礦業大學成功研制出國內首臺太空采礦機器人,標志著我國在太空資源開發領域邁出了重要一步。 太空采礦并非新鮮概念…

簡介PyCDE:Python CIRCT Design Entry

簡介PyCDE:Python CIRCT Design Entry 引言 在硬件設計和驗證領域,隨著設計復雜性的增加,傳統的方法往往難以滿足現代設計的需求。PyCDE(Python CIRCT Design Entry)作為CIRCT項目的一部分,旨在為硬件設計…

市場熱點復盤20240319

以下是對當前市場熱點板塊的分析總結,按邏輯分類如下: 一、機器人產業鏈核心標的 1. 減速器與核心部件 襄陽軸承:直接受益人形機器人減速器軸承需求,技術國內領先。金帝股份:聚焦機器人手指關節諧波減速機保持架&am…

目標檢測——清洗數據

清洗VOC格式數據集代碼示例 import os import xml.etree.ElementTree as ETdef process_annotations(image_folder, annotation_folder):# 遍歷標簽文件夾中的所有XML文件for xml_file in os.listdir(annotation_folder):if not xml_file.endswith(.xml):continuexml_path os…

Kubeasz工具快速部署K8Sv1.27版本集群(二進制方式)

文章目錄 一、基本信息二、服務器初始化操作三、使用Kubeasz部署K8S集群四、驗證集群 一、基本信息 1、部署需要滿足前提條件: 注意1:確保各節點時區設置一致、時間同步;注意2:確保在干凈的系統上開始安裝;注意3&…

RG-S3760應用協議配置

RG-S3760應用協議配置 1. dhcp 服務配置 提問:如何在設備上開啟dhcp 服務,讓不同VLAN 下的電腦獲得相應的IP 地址? 回答: 步驟一:配置VLAN 網關IP 地址,及將相關端口劃入相應的VLAN 中 S3760#con t S…

Java 文件和IO流基礎(生動形象版)

系列文章目錄 Java文件和IO流基礎部分 文件VSIO流 文章目錄 系列文章目錄前言一、文件的定義和理解: 1.專業定義: 2.文件系統和路徑: 二、IO流的定義和分類 1.定義:2.流的分類:修飾器模式的核心作用:基礎結…

Linux驅動學習筆記(四)

高級字符設備進階 1.一個完整的IO過程包含以下幾個步驟:1應用程序向操作系統發起IO調用請求(系統調用);2操作系統準備數據,把IO設備的數據加載到內核緩沖區;3操作系統拷貝數據,把內核緩沖區的數據從內核空間拷貝到應用…