一、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(需結合客戶端版本支持)。