Apache 消息隊列分布式架構與原理

消息隊列

基本概念

定義

消息隊列(Message Queue, MQ)是一種分布式中間件,通過異步通信、消息暫存和解耦生產消費雙方的機制,提供消息的順序性保證、可靠投遞和流量控制能力,廣泛應用于微服務解耦、大數據流處理等場景。

核心組件

生產者 producer:消息的生產者,負責發送消息。

消費者 consumer:消息的消費者,訂閱并處理消息。

消費者組 consumer group:所有消費者都屬于某一消費者組,同一個消費者組內的消費者共同消費同一類型的消息,實現消費性能的擴展。

租戶 tenant:邏輯概念,是資源歸屬和權限控制的基本單位。

集群 cluster:一組節點的集合。

Broker:用于存儲和轉發消息的物理節點。

主題 topic:邏輯概念,同一種業務類型的消息的集合。

偏移量 offset:消息的唯一標識,由消費者返回,記錄目前消費的位置。

消息模型

點對點:消息被單個消費者消費,如訂單處理。

發布/訂閱:消息廣播給多個消費者,如新聞推送。

核心功能

功能

說明

服務解耦

解除多個業務系統之間的耦合度,減少系統之間影響

異步通信

生產者和消費者無需同時在線,通過消息隊列暫存消息實現異步通信

流量控制

削峰填谷,突發流量被隊列緩沖,避免壓垮下游系統

順序收發

先進先出,保證消息的順序性(全局有序或分區有序)

零拷貝

通過 OS 和硬件協作,減少數據在內存中的冗余復制,實現高吞吐

消息回溯

?offset 到指定位置,重新消費歷史消息

應用場景

大數據流處理:實時數據處理 ETL

金融支付對賬、交易流水

物聯網設備指令下發、狀態上報

微服務:服務 A 通過 MQ 通知服務 B,避免直接 HTTP 調用帶來的耦合和超時風險

Kafka

架構設計

1.??生產者從 ZooKeeper* 獲取 Topic 的元數據(如 Partition Leader 的位置)后,以 push 模式發布消息到對應的 broker 上。

2.??每條消息都屬于一個 Topic,每個 Topic 分為多個 Partition 分區,物理上由多個日志分片 Segment 文件組成。每個 Partition 都有多個副本,被存儲在不同的 Brokers 上。消息發送到 Leader 后,會同步到 Follower 以確保冗余。

3.??消費者以 pull 模式從 Leader 主副本里拉取消息,返回 offset 值用于記錄現在消費的位置。

* ZooKeeper 的核心作用

功能

說明

Broker 注冊

Broker 啟動時向 ZooKeeper 注冊自己的地址和 Partition 分配情況

Leader 選舉

當 Leader Partition 宕機時,協助選舉新的 Leader

Topic 配置管理

存儲 Topic 的 Partition 數量、副本因子等元數據

功能原理

1.??持久化:消息存儲在 broker 磁盤中,被消費后不會立即被刪除

2.??高吞吐:單個 partition 批處理,多個 partition 并行處理

3.??高擴展:topic 分區化,存儲在不同 brokers 中

4.??容災和高可用:每個 partition 都有多個副本,ISR 確保副本之間的同步

5.??低延遲:稀疏索引和二分查找

RocketMQ

架構設計

1.??生產者向 NameServer 查詢 Topic 的路由信息,選擇目標 MessageQueue。

2.??發送消息到對應的 Master Broker,同步到 Slave。

3.??消費者從 NameServer 獲取 Topic 的路由信息,從 Master Broker 拉取消息,定期提交 Offset 到 Broker。

功能原理

1.??金融級可靠

同步刷盤

所有消息先寫入磁盤后才返回 ACK,確保數據不丟失

主從同步復制

消息必須同步到 Slave 節點后才響應生產者,避免主節點宕機丟數據

Broker 主從切換

Master 故障時,Slave 自動提升為新 Master

多副本

支持多副本,數據分布在不同物理機/機架

嚴格的順序性

同一隊列的消息嚴格 FIFO,適用于金融交易(如訂單狀態變更)

死信隊列

處理失敗的消息自動進入 DLQ,避免阻塞正常流程

2.??事務消息:兩階段提交

-?生產者發送一條對消費者不可見的半消息(Half Message)到 Broker,Broker 持久化該消息,但不會將其投遞給消費者。

-?生產者執行本地數據庫操作后,根據本地事務結果,向 Broker 發送 Commit 或 Rollback 指令。

-?僅當收到 Commit 后,Broker 才將消息標記為可消費,后續推送給消費者,以確保本地數據庫事務和消息發送兩個操作的原子性。

3.??消息過濾:基于 tag 或 sql 語句進行過濾,在服務端將符合條件的消息投遞給消費者。

Pulsar

產品架構設計

* Segment 即 BookKeeper 的 Ledger,是一種 append-only 的日志文件

1.??生產者查詢 Topic 路由,將消息發送到對應的 Broker

2.??消息被拆分為多個 Segment,broker 將消息寫到多個 bookie 中持久化存儲同一個 partition 的 segment 分散在多個 bookie,支持多個 bookie 并行讀取。

3.??消費者請求消息,broker 從 bookie 中拉取消息并轉發給消費者

功能原理

1.??計算(Broker)與存儲(Bookie)分離:

- broker:無狀態的 proxy 服務,負責接收消息、傳遞消息、集群負載均衡等操作。

-?bookie:有狀態,負責持久化存儲消息

2.??故障隔離:Broker 崩潰不影響數據,Bookie 故障自動從其他副本重建恢復。

3.??彈性擴展:Broker 無需考慮數據遷移,可快速水平擴縮容;Bookie 存儲層可按需獨立擴展,新增 Bookie 后,數據自動重新分布。

MQ 系列對比

產品

Kafka

RocketMQ

Pulsar

產品特性

高并發、高吞吐、實時流處理平臺

低延遲、高可靠、強一致

云原生、存算分離、跨地域復制

應用場景

對吞吐要求高的離線場景

對可靠性要求高的在線業務場景

兼容在線和離線請求

適用業務

? 網頁活動追蹤

? 日志分析、監控采集

? 流數據集成

? 電商在線支付、直播

? 證券交易

? 金融對賬

? 跨云/跨地域數據同步

? IoT 設備管理監控

? Serverless 事件驅動

broker

存儲數據,處理消息請求

存儲數據,處理消息請求

無狀態的服務,不存儲數據,只負責消息的路由處理

數據存儲單位

Partition

CommitLog(唯一物理存儲文件,完全順序寫入)

Segment(顆粒更小,更利于存儲負載均衡)

數據一致性

依賴 ISR 機制

同步刷盤 + 主從同步

BookKeeper 支持同步復制

擴展性

通過增加 Partition 數量,擴容 Broker 需要 rebalance

通過增加 Broker 組擴展 Queue 數量

Broker/Bookie 獨立按需擴展計算/存儲

故障切換

依賴 Controller 選舉新 Leader

組內 Slave 接管 Master無需數據遷移立即接管

? Broker 崩潰后,新節點無需數據遷移立即接管

? Bookie 節點故障時,數據自動從其他副本重建

常見問題

為什么需要消息隊列?

首先知道什么消息隊列消息隊列通過解耦生產消費者實現消息異步流量控制功能

那么什么生產者/消費者生產者通常是業務動作的發起者生產需要被傳遞或處理的業務數據可以是訂單系統支付系統傳感器設備消費者通常下游服務數據分析模塊比如庫存系統Spark 作業

為什么需要解耦生產者消費者消息隊列產品的主要作用就是轉儲日志、監控數據等,舉個例子就像豐巢快遞柜,快遞員若是不能把快遞及時送到人員手上會造成快遞擁堵,效率減慢;但是有豐巢柜來存儲后就可以有一個地方暫存,消費者需要消費的時候再去拿快遞,拉消息一樣的道理。通過消息隊列,業務系統可以做到故障隔離(生產者宕機不影響消費者)彈性擴展(應對流量波動),真正實現“高內聚、低耦合”的業務架構。

為什么叫消息隊列為集群?

集群是一組節點的集合,節點可以是物理機或虛擬機。消息隊列產品采用了分布式架構設計通過多節點協作實現高可用高性能擴展性具體參見上面架構設計

命名空間是做什么的?

命名空間多租戶之間實現邏輯隔離。

首先要理解多租戶的概念,多租戶就是多個用戶共享一個集群。消息隊列產品通過命名空間角色權限配合實現權限管控從而實現不同命名空間邏輯隔離具體來講就是用戶角色配置某個命名空間讀寫權限一個命名空間里的所有 topic?都繼承相同的設置則用戶只對該命名空間內的 topic 操作權限可以參考下圖幫助理解

如何理解 topic 這個概念?

學習消息隊列產品過程中注意區分邏輯概念和物理概念 topic partition 都是業務邏輯概念實際上最后消息都是一個 segment 文件形式存儲物理機器

topic?代表了消息的類別或主題,是生產消費的最小單位。從業務層面來講,topic?就像是一個消息的分類標簽,生產者將相關的消息發送到特定的?topic?中,而消費者則通過訂閱感興趣的?topic?來獲取和處理這些消息。這種設計使得不同業務領域的消息能夠自然地隔離,比如訂單系統的消息可以發布到"order_topic",而支付系統的消息則流向"payment_topic",從而實現業務邏輯的清晰劃分。

topic 的設計還體現了消息隊列的關鍵特性——發布/訂閱模式。生產者不需要知道有哪些消費者存在,只需關注將消息發送到正確的 topic;同樣,消費者也只需訂閱自己關心的 topic,無需感知消息的生產者是誰。這種松耦合的架構使得系統各組件能夠獨立演化,大大提升了整體架構的靈活性。此外,通過 topic 可以實現消息的多播,即一條消息可以被多個消費者組同時消費,這在需要將同一數據用于不同業務場景時顯得尤為重要。

什么是數據落盤?

計算機存儲內存緩存

消息隊列接收到的數據寫入磁盤持久化存儲過程叫做落盤比如消息存儲 kafka rocketmq broker 以及 pulsar bookie 磁盤這個過程

具體實現kafka 消息先寫入 Page Cache(內存緩沖),再異步刷盤(可配置同步刷盤)RocketMQ 支持同步刷盤(每條消息立即寫入磁盤)或異步刷盤(批量寫入)

消息隊列如何保證數據的一致性?

kafka 通過 ISR(In-Sync Replicas)機制來維護數據一致性。當生產者發送消息時,Leader 副本會先將消息寫入本地日志,然后要求所有 ISR 中的 Follower 副本完成同步復制后,這條消息才會被確認為已提交。

RocketMQ 采用了雙重保障機制來維護數據一致性。首先是同步刷盤策略,當 Broker 接收到消息后,可以選擇立即將消息寫入磁盤(同步刷盤)而非僅保留在內存中。其次是主從同步機制,每個主節點都會將消息同步到其從節點,只有當主從都成功寫入后才會向生產者返回確認響應。

Pulsar 依賴 BookKeeper 作為底層存儲引擎,每條消息都會被同步復制到多個 Bookie 節點,只有當大多數節點確認寫入后,這條消息才會被標記為持久化成功。

參考鏈接

Apache Kafka

RocketMQ · 官方網站 | RocketMQ 消息隊列

Apache Pulsar | Apache Pulsar

https://zhuanlan.zhihu.com/p/103249714

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

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

相關文章

ModernBERT如何突破BERT局限?情感分析全流程解析

自2018年推出以來,BERT 徹底改變了自然語言處理領域。它在情感分析、問答、語言推理等任務中表現優異。借助雙向訓練和基于Transformer的自注意力機制,BERT 開創了理解文本中單詞關系的新范式。然而,盡管成績斐然,BERT 仍存在局限…

股票Level2逐筆成交及十檔訂單簿分鐘級Tick歷史行情數據詳細解析

本地股票數據處理與分析實戰指南 在量化投資與金融數據分析領域,高效處理本地存儲的股票數據是核心能力之一。本文將從數據類型定義、解析流程及實際應用角度,系統介紹如何基于CSV文件管理股票分鐘數據、高頻Tick數據、逐筆數據、Level2歷史行情等多樣化…

面向互聯網2C業務的分布式類Manus Java框架

本文介紹了阿里巴巴推出的分布式類ManusAgent框架——ali-langengine-dflow,旨在解決現有Agent架構在互聯網2C業務場景中的局限性。文章從背景出發,分析了當前主流Agent架構(如Manus、字節TARS、AutoGLM)存在的問題,如…

Java-82 深入淺出 MySQL 內部架構:服務層、存儲引擎與文件系統全覆蓋

點一下關注吧!!!非常感謝!!持續更新!!! 🚀 AI篇持續更新中!(長期更新) AI煉丹日志-30-新發布【1T 萬億】參數量大模型!Kim…

開發避坑短篇(6):Vue+Element UI 深度選擇器實現表單元素精準對齊的技術實踐

需求 el-form 表單的el-input和el-select默認寬度度不一致&#xff0c;導致不對齊&#xff0c;如下圖。那么如何設置讓el-input和el-select的寬度度一致并對齊&#xff1f;<el-form class"page-form" :model"addForm" :rules"rules" :disable…

rust-參考與借用

參考與借用 在清單4-5中的元組代碼的問題在于&#xff0c;我們必須將String返回給調用函數&#xff0c;這樣我們才能在調用calculate_length之后繼續使用String&#xff0c;因為String已經被移動到了calculate_length中。相反&#xff0c;我們可以提供一個對String值的引用。引…

深入解析HDFS Federation:如何有效解決單NameNode瓶頸問題

HDFS Federation簡介與背景在Hadoop分布式文件系統&#xff08;HDFS&#xff09;的經典架構中&#xff0c;NameNode作為核心組件承擔著整個文件系統的元數據管理職責。這一設計雖然簡潔高效&#xff0c;但隨著數據規模的爆炸式增長&#xff0c;單NameNode架構逐漸暴露出難以克服…

為什么選擇EasyGBS?

作為集 算法倉、算力設備接入、視頻云平臺 于一體的綜合性智能安防監控平臺&#xff0c;EasyGBS有哪些優勢是您的必選理由呢&#xff1f;一、設備與協議的兼容性EasyGBS不挑設備品牌型號。只要支持GB28181、RTSP、ONVIF、RTMP標準協議里的任一種&#xff0c;就能將視頻接入。但…

【形態學變換】——圖像預處理(OpenCV)

目錄 1 核 2 腐蝕 3 膨脹 4 開運算 5 閉運算 6 禮帽運算 7 黑帽運算 8 形態學梯度 形態學變換是一種基于形狀的簡單變換&#xff0c;處理對象是二值化后的圖像。有兩個輸入&#xff1a;原圖像和核&#xff0c;一個輸出&#xff1a;形態學變換后的圖像。基本操作有以下四…

一次“非法指令”(SIGILL)問題的完整調試過程:CPU指令集兼容性探秘

一次"非法指令"問題的完整調試過程&#xff1a;CPU指令集兼容性探秘一、問題概述二、問題現象與初步分析1. 環境與現象2. 官方文檔的線索3. 重現問題4. 懷疑方向&#xff1a;CPU指令兼容性5. 關鍵發現&#xff1a;AVX512指令三、詳細調試過程1. 搭建調試環境 (KVM虛擬…

Node.js - 創建 Express 項目

創建 Express 項目 安裝 npm i -g express-generatorornpm i -g express-generator4# 注意&#xff1a;Windows有可能碰到提示&#xff1a;npm : 無法加載文件 C:\Program Files\nodejs\npm.ps1&#xff0c;因為在此系統上禁止運行腳本。 # 如果碰到這個錯誤&#xff0c;需要…

高并發系統設計面試題

高并發系統設計面試題&#x1f525;&#x1f525;&#x1f525; 超高頻問題&#xff08;幾乎必問&#xff09;讓你設計一個秒殺系統&#xff0c;你會考慮哪些問題&#xff1f;如果你的業務量突然提升100倍QPS你會怎么做&#xff1f;庫存扣減如何避免超賣和少賣&#xff1f;訂單…

【通識】如何看電路圖

1. 電路圖 1.1 基礎概念 電路圖即電原理圖。 電路圖第一種是說明模擬電子電路工作原理&#xff0c;用圖形符號表示電阻器、電容器、開關、晶體管等實物&#xff0c;用線條把元器件和單元電路按工作原理的關系連接起來。 第二種則是說明數字電子電路工作原理的。用圖形符號表示…

SpringBoot實戰指南:從快速入門到生產級部署(2025最新版)

一、為什么SpringBoot依然是Java開發的首選&#xff1f; SpringBoot自2014年發布以來&#xff0c;已成為Java企業級開發的事實標準框架。根據2025年最新調研數據顯示&#xff0c;全球78%的Java微服務項目基于SpringBoot構建&#xff0c;其核心優勢在于&#xff1a; 約定優于配置…

新房裝修是中央空調還是壁掛空調好?

這個要看戶型和投資金額&#xff0c;大戶型空間適合裝中央空調&#xff0c;因為空間大有足夠的地方安裝&#xff0c;功率也可以根據面積大小進行配置&#xff0c;整體配置一個外機就行了&#xff0c;整體的裝修效果比較規整&#xff0c;就是多花點&#xff0c;使用成本也稍高點…

如何理解泊松分布

文章目錄一、引例——鯨魚研究二、泊松分布一、引例——鯨魚研究 有生態學家對生活在北冰洋水域的鯨魚進行了跟蹤研究&#xff0c;他們利用一臺水下無人機來探測鯨魚數量&#xff0c;這是近十天的數據&#xff1a; 第1天第2天第3天第4天第5天第6天第7天第8天第9天第10天10101…

python學習DAY22打卡

作業&#xff1a; 自行學習參考如何使用kaggle平臺&#xff0c;寫下使用注意點&#xff0c;并對下述比賽提交代碼 kaggle泰坦尼克號人員生還預測 import warnings warnings.filterwarnings("ignore") #忽略警告信息 # 數據處理清洗包 import pandas as pd import …

在 Ansys CFX Pre 中配置 RGP 表的分步指南

掌握在 Ansys CFX Pre 中設置 RGP 表的技巧&#xff0c;以優化仿真精度和效率。挑戰在計算流體動力學 &#xff08;CFD&#xff09; 領域&#xff0c;RGP&#xff08;真實氣體屬性&#xff09;表對于準確模擬流體在不同條件下的行為至關重要。這些表格提供了詳細的熱力學屬性&a…

C語言————原碼 補碼 反碼 (日漸清晰版)

本文的內容通下面這篇文章有著緊密的聯系&#xff0c;讀者可以選擇性閱讀 C語言————二、八、十、十六進制的相互轉換-CSDN博客 目錄 基本概念 原碼 反碼 補碼 轉換 數據的存儲方式 基本存儲單位 數據的計算方式 補碼的模運算原理 移位操作符 左移操作符 右移操…

函數-變量的作用域和生命周期

變量的作用域 引入問題 我們在函數設計的過程中&#xff0c;經常要考慮對于參數的設計&#xff0c;換句話說&#xff0c;我們需要考慮函數需要幾個參數&#xff0c;需要什么類型的參數&#xff0c;但我們并沒有考慮函數是否需要提供參數&#xff0c;如果說函數可以訪問到已定義…