RabbitMQ 4.1.1初體驗

為什么選擇 RabbitMQ?*

RabbitMQ 是一款可靠且成熟的消息代理和流處理中間件,可輕松部署在云端、本地數據中心或您的開發機上,目前已被全球數百萬用戶使用。
優勢在哪里
互操作性
RabbitMQ 支持多種開放標準協議,包括 AMQP 1.0 和 MQTT 5.0,并提供多種編程語言的客戶端庫,您只需選擇適合自己語言的版本即可,無需擔心廠商鎖定!

靈活性
RabbitMQ 提供多種功能組合,可自定義消息從生產者到單個或多個消費者的傳遞方式,如路由、過濾、流處理、聯邦傳輸等,應有盡有。

可靠性
通過消息確認機制和集群消息復制,RabbitMQ 能確保您的消息安全無誤。
在這里插入圖片描述
總結
RabbitMQ 是輕量級、易用、功能全面的消息中間件,適合需要靈活路由、多協議支持、高可靠性的場景。如果您的業務需要簡單的任務隊列或復雜的事件路由,RabbitMQ 是理想選擇;若是日志處理或大數據流,可考慮 Kafka。

常見使用場景示例

以下是來自社區或客戶的一些典型用例,幫助您更好地理解 RabbitMQ 的功能及其實際應用價值。

1. 解耦互聯服務(通過RabbitMQ實現通知系統)

在這里插入圖片描述

場景描述
你有一個后端服務,需要向終端用戶發送通知。通知有兩種渠道:

  • 電子郵件(Email)
  • 移動應用推送(Push Notification)

傳統做法可能是后端直接調用郵件服務和推送服務,但這會導致:

  • 系統緊耦合:如果郵件服務宕機,可能影響整個通知流程。
  • 無法應對突發流量:如果突然有大量通知請求,后端可能被壓垮。
  • 維護困難:升級或維護某個通知服務時,需要停用整個系統。

RabbitMQ 的解決方案
使用 RabbitMQ 解耦后端服務和通知渠道,流程如下:

  • 后端服務(Producer) 生成通知后,不直接調用郵件或推送服務,而是將消息發布到兩個獨立的隊列:

    • email_queue(郵件隊列)
    • push_queue(推送隊列)
  • 郵件服務和推送服務(Consumer) 各自訂閱對應的隊列,并異步處理消息。

    • [Backend Service]

      ├── Publishes to → [email_queue] → Consumed by [Email Service]

      └── Publishes to → [push_queue] → Consumed by [Push Notification Service]

2. 基于 RabbitMQ 的遠程過程調用(RPC)實現票務系統

在這里插入圖片描述
場景描述
你經營一個音樂廳,門票通過多個渠道銷售:

  • 線上網站
  • 線下自助終端(Kiosk)

所有渠道的訂單都需要經過復雜的票務庫存處理(如檢查余票、分配座位等),并且要求極低延遲的響應(用戶下單后需立即知道是否成功)。

傳統同步調用的問題

如果直接使用同步調用(如 HTTP API):

  • 高延遲:庫存服務處理時間不穩定,可能阻塞前端響應。
  • 系統耦合:庫存服務宕機會導致所有銷售渠道不可用。
  • 并發沖突:多個渠道同時搶票時,可能超賣(需依賴數據庫事務,性能低下)。

RabbitMQ 的 RPC 解決方案
通過 RabbitMQ 實現異步 RPC 調用,流程如下:

  • 1、發布訂單請求

    • 網站或終端(RPC Client)生成訂單,附帶唯一 correlation_id,發送到請求隊列

    • [Client] → Publish to → [rpc_request_queue]
      (Message: {order_details, correlation_id})

  • 2、處理訂單

    • 庫存服務(RPC Server)從 rpc_request_queue 消費消息,處理業務邏輯(如檢查余票)。
  • 3、返回響應

    • 庫存服務將處理結果(成功/失敗)發送到響應隊列,并攜帶相同的 correlation_id
    • [Server] → Publish to → [rpc_reply_queue]
      (Message: {result, correlation_id})

  • 4、客戶端接收響應

    • 客戶端監聽 rpc_reply_queue,通過 correlation_id 匹配自己的請求,獲取結果。
    • ±---------------+ ±------------------+
      | RPC Client | | RPC Server |
      | (Website/Kiosk)| | (Inventory Service)|
      ±------±-------+ ±--------±--------+
      | |
      | 1. Order + correlation_id|
      ±------------------------------------->+
      | |
      | 3. Result + correlation_id|
      <--------------------------------------+
      | |
      ±------±-------+ ±--------±--------+
      | rpc_request_queue | rpc_reply_queue |
      ±---------------+ ±------------------+

關鍵設計點

  • 關聯 ID(correlation_id)
    確保響應與請求正確匹配,避免多客戶端場景下的混亂。

  • 隊列選擇

    • 經典隊列(Classic Queue):低延遲,但消息可能丟失(適合可重試場景)。
    • 仲裁隊列(Quorum Queue):高可靠性,通過多數節點確認保證消息安全(適合金融級場景)。
  • 序列化處理
    所有訂單按先進先出(FIFO)處理,避免超賣,無需數據庫事務。

實際應用擴展

  • 機票預訂系統:多平臺同時搶票時,通過 RabbitMQ RPC 保證庫存一致性。
  • 秒殺活動:突發流量下,用隊列緩沖請求,按序處理。

3、RabbitMQ流式處理(Streaming)詳解

在這里插入圖片描述

場景描述
你運營一個視頻平臺(如B站、YouTube)。當用戶上傳視頻后,系統需要完成多個后續任務:

1. 實時任務:立即通知訂閱該UP主的粉絲。

2、延遲任務

  • 視頻內容分析(如AI鑒黃、標簽提取)

  • 轉碼生成多種清晰度的副本(如1080p、720p)

  • 數據統計(如播放量預測)

傳統架構的問題
若用普通消息隊列(如RabbitMQ經典隊列):

  • 消息重復:每個任務需要獨立隊列,同一視頻上傳事件會被復制多份(通知隊列、轉碼隊列等),浪費資源。

  • 無法回溯:消息被消費后即刪除,若分析服務崩潰,可能丟失數據。

RabbitMQ Streams的解決方案
1. 核心機制

  • 持久化流(Stream)
    上傳服務將“新視頻”事件按順序追加到唯一流中(類似數據庫的WAL日志)。

[視頻上傳事件流]
──? [事件1: 視頻A上傳] → [事件2: 視頻B上傳] → [事件3: 視頻C上傳] → …

  • 多消費者獨立訂閱:
    每個后端服務(通知、轉碼、分析)可獨立讀取流中的事件,互不干擾。

2. 工作流程

  • 2.1視頻上傳完成 → 事件寫入流(如video_upload_stream)。

  • 2.2通知服務
    - 實時讀取最新事件,立即推送粉絲。
    - 讀取后不刪除事件,其他服務仍可訪問。

  • 2.3轉碼服務
    按自身速度消費事件,生成多分辨率視頻。

  • 2.4分析服務
    每天凌晨批量讀取全天事件,運行離線分析。

3. 關鍵優勢

優勢說明
高效無重復所有任務共享同一流,無需為每個任務復制消息。
消費者獨立性每個服務可自由控制讀取位置(如通知讀最新,分析讀歷史)。
消息可回溯即使服務崩潰,重啟后可從斷點繼續消費,數據不丟失。
高吞吐流式存儲針對順序讀寫優化,性能高于傳統隊列。

技術對比:Stream vs 經典隊列

特性RabbitMQ經典隊列RabbitMQ Streams
消息生命周期消費后默認刪除永久存儲(除非手動刪除)
多消費者同一隊列消息只能被一個消費者多消費者獨立讀取同一流
回溯能力不支持支持(通過偏移量定位)
適用場景任務分發、RPC事件溯源、日志處理

實際應用示例

  • 視頻平臺(如案例所述)

  • 電商訂單流水

    • 訂單創建事件寫入流,實時通知用戶、異步更新庫存、離線生成報表。
  • 物聯網傳感器數據

    • 設備數據實時流,同時供監控告警和離線分析使用。

為何選擇RabbitMQ Streams?

  • 解耦:上傳服務無需知道下游有哪些任務。

  • 彈性:新增任務(如后續增加“視頻指紋提取”)只需新增一個消費者,無需改原有架構。

  • 可靠性:消息持久化,即使服務器重啟也不丟失。

一句話總結: RabbitMQ Streams通過持久化、可共享的消息流,實現了高效、靈活的事件驅動架構,特別適合混合實時與離線處理的場景。

4、基于 RabbitMQ 的星際無人機(IoT)通信系統

在這里插入圖片描述

場景描述
你經營一家提供銀河系包裹配送的公司,擁有大量太空無人機(Space Drones)。這些無人機需要定期向位于系外行星 Kepler-438 b 的中央服務器上報狀態(如位置、電量、包裹狀態)。但星際網絡連接極不穩定,經常因行星軌道錯位或宇宙干擾中斷。
傳統方案的挑戰
若直接讓無人機通過 HTTP 或 TCP 連接中央服務器:

  • 網絡不可靠:信號延遲高(可能幾小時到幾天),連接頻繁中斷。
  • 數據丟失風險:斷網時無人機的狀態報告無法送達。
  • 海量連接管理:數百萬無人機同時在線,服務器難以承受。

RabbitMQ 的解決方案

  • 1. 分布式消息緩沖架構

    • 每個無人機本地部署 RabbitMQ 節點

      • 無人機將狀態報告先寫入本地 RabbitMQ(邊緣存儲),避免依賴實時網絡。
      • 數據持久化,即使無人機重啟也不會丟失。
    • 上游中心化 RabbitMQ

      • 位于 Kepler-438 b 的服務器運行主 RabbitMQ,接收所有無人機的最終數據。
  • 2. 網絡恢復后同步數據

    • 行星對齊時(網絡恢復)
      本地 RabbitMQ 通過 Shovel/Federation 插件,將積壓的報告批量同步到上游服務器。

      • Shovel:單向跨節點消息轉移,適合臨時連接。

      • Federation:動態拓撲的消息同步,適合復雜網絡。

  • 3. 協議選擇

    • MQTT 協議

      • 無人機與本地 RabbitMQ 之間使用 MQTT(輕量級 IoT 協議),支持:

        • 低功耗(適合太空設備)。
        • 高并發連接(百萬級無人機)。
      • RabbitMQ 通過 MQTT 插件 兼容此協議

系統架構圖

[無人機 Drone 1] → [本地 RabbitMQ] -
[無人機 Drone 2] → [本地 RabbitMQ] → 行星對齊時同步 → [上游 RabbitMQ (Kepler-438 b)] → [中央服務器]
… /
[無人機 Drone N] → [本地 RabbitMQ]

核心優勢(Benefits)

優勢說明
離線優先無人機在網絡中斷時仍能持續記錄數據,不會丟失報告。
彈性網絡適應僅在網絡可用時同步,容忍高延遲和間歇性連接。
高并發支持MQTT 協議優化海量設備連接,RabbitMQ 集群橫向擴展。
解耦與可靠性中央服務器無需知道無人機是否在線,消息最終一致。

關鍵技術組件

1、RabbitMQ Shovel

  • 將本地隊列的消息自動轉發到上游交換器。
  • 配置示例:
{rabbitmq_shovel, [{shovels, [{drone_to_central, [{sources, [{brokers, ["localhost"]}]},{destinations, [{brokers, ["kepler-438b.server"]}]},{queue, <<"drone_reports">>}]}]}
]}

2、RabbitMQ Federation

  • 跨星球的 RabbitMQ 節點形成聯邦,按需同步消息。

  • 適合長期網絡不穩定的場景。

3、MQTT 插件

  • 啟用 MQTT 協議支持:
rabbitmq-plugins enable rabbitmq_mqtt

對比其他消息中間件

特性RabbitMQ (+MQTT)KafkaAWS IoT Core
離線支持??(邊緣節點緩沖)?(需持續連接)??(但需額外配置)
協議兼容性MQTT/AMQP/STOMP自定義協議僅MQTT/HTTP
部署復雜度中(需配置Shovel)低(全托管)
適用場景邊緣計算+最終一致性高吞吐日志流純云端IoT

實際應用擴展

  • 地球上的類似場景

    • 遠洋船舶、油田設備在衛星網絡間歇可用時的數據上報。

    • 軍事無人機在敵占區的隱蔽通信。

其他行業

  • 智能電網(電表數據批量同步)。
  • 自動駕駛車隊(離線時本地存儲,網絡恢復后上傳)。

總結
通過 RabbitMQ 的分布式消息隊列 + MQTT 協議,該系統實現了:

  • 抗網絡中斷:邊緣節點緩沖數據,行星對齊時同步。
  • 海量設備管理:MQTT 支持百萬級無人機連接。
  • 靈活性:Shovel/Federation 適應不同網絡拓撲。
    這種架構是 深空通信、邊緣計算、IoT 設備管理 的理想選擇! 🚀

RabbitMQ工作模型

在這里插入圖片描述
rabbitmq和mysql作類比,理解rabbitmq概念:

  • broker 相當于mysql服務器
  • virtual host相當于數據庫(一個mysql服務器可以有多個數據庫,一臺broker可以有多個虛擬主機)
  • queue相當于表(一個數據庫有多張表,一個虛擬主機有多個隊列)
  • 消息相當于記錄(一張表中有多條記錄,一個隊列中有多條消息)

消息隊列有三個核心要素: 消息生產者消息隊列消息消費者
生產者(Producer):發送消息的應用;(java程序,也可能是別的語言寫的程序)
消費者(Consumer):接收消息的應用;(java程序,也可能是別的語言寫的程序)
代理(Broker):就是消息服務器,RabbitMQ Server就是Message Broker
連接(Connection):連接RabbitMQ服務器的TCP長連接;
信道(Channel):連接中的一個虛擬通道,消息隊列發送或者接收消息時,都是通過信道進行的;
虛擬主機(Virtual host):一個虛擬分組,在代碼中就是一個字符串,當多個不同的用戶使用同一個RabbitMQ服務時,可以劃分出多個Virtual host,每個用戶在自己的Virtual host創建exchange/queue等;(分類比較清晰、相互隔離)
交換機(Exchange):交換機負責從生產者接收消息,并根據交換機類型分發到對應的消息隊列中,起到一個路由的作用;
路由鍵(Routing Key):交換機根據路由鍵來決定消息分發到哪個隊列,路由鍵是消息的目的地址;
綁定(Binding):綁定是隊列和交換機的一個關聯連接(關聯關系);
隊列(Queue):存儲消息的緩存;
消息(Message):由生產者通過RabbitMQ發送給消費者的信息;(消息可以為任何數據,字符串,user對象,json串,圖片,mp3,視頻等等)

Exchange(X) 可翻譯成交換機/交換器/路由器

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

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

相關文章

【精華】QPS限流等場景,Redis其他數據結構優劣勢對比

下面是一個詳細的 Redis 數據結構對比表&#xff0c;比較它們在實現 QPS 限流 / 滑動窗口統計 / 查定比監控等場景中的適用性&#xff1a; ? Redis 數據結構對比表&#xff08;用于接口限流 / QPS 監控&#xff09; 維度String INCR 固定窗口List 滑動窗口Hash 計數器ZSet 滑…

頂層設計:支持單元化、灰度化的應用架構

一、頂層目標 業務連續性&#xff1a;任何單元故障不影響整體彈性伸縮&#xff1a;根據業務流量橫向擴展靈活灰度&#xff1a;任何發布都可逐步平滑上線成本可控&#xff1a;單元化帶來的資源冗余最小 二、核心理念 設計目標核心理念單元化垂直拆分&#xff0c;分而治之&…

MacOS Safari 如何打開F12 開發者工具 Developer Tools

背景 If you’re a web develper, the Safari Develop menu provides tools you can use to make sure your website works well with all standards-based web browsers. 解決 If you don’t see the Develop menu in menu bar, Choose Safari > settingsClick Advanced…

2025—暑期訓練一

A 本題描述了一個最優路徑規劃問題的解法&#xff0c;核心思路是利用數軸上區間覆蓋的特性&#xff0c;將問題簡化為兩個端點的訪問問題。以下是關鍵點的詳細解析&#xff1a; 核心觀察 區間覆蓋特性 給定的位置數組 x1, x2, ..., xn 是嚴格遞增的&#xff08;即 x1 < x2 …

ubuntu 18.04配置鏡像源

配置鏡像源的主要作用是優化軟件下載速度、提升系統更新穩定性&#xff0c;并確保軟件包獲取的可靠性 我這里配置阿里云鏡像源 鏡像的具體內容參考此文: 文章鏈接 以防萬一,先備份一下 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak然后開始修改 sudo nano /etc…

RecyclerView中跳轉到最后一條item并確保它在可視區域內顯示

在RecyclerView中跳轉并顯示最后一條Item 要在RecyclerView中跳轉到最后一條item并確保它在可視區域內顯示&#xff0c;可以使用以下幾種方法&#xff1a; 1. 使用scrollToPosition()方法&#xff08;基本方法&#xff09; recyclerView.scrollToPosition(adapter.getItemCo…

ubuntu22 桌面版開啟root登陸

一、先創建root sudo passwd root 二、注釋代碼 vim /etc/pam.d/gdm-password vim/etc/pam.d/gdm-autologin 都注釋 auth required pam_succeed_if.so user ! root quiet_success 三、修改profile文件 vim /root/.profile 注釋掉 mesg n 2&#xff1e; /dev/null || true 插入新…

docker學習二天之鏡像操作與容器操作

鏡像的一般運用過程 一、鏡像&#xff08;Image&#xff09;操作 鏡像是容器的基礎模板&#xff0c;存儲在本地或遠程倉庫中。 1. 鏡像拉取 # 從指定鏡像源拉取 docker pull docker.m.daocloud.io/library/nginx 2. 鏡像查看 # 列出本地鏡像 docker images # 或 docker image…

多個參數用websocket 向io 服務器發送變量,一次發一個,并接收響應

問題&#xff1a;多個參數用websocket 向io 服務器發送變量&#xff0c;一次發一個&#xff0c;并接收響應&#xff0c;如果是多個變量&#xff0c;但還是需要一個個發送&#xff0c;應該怎么實現&#xff0c;思路是什么樣子的呢&#xff1f;用數組的話&#xff0c;應該怎么用&…

Flink-05學習 接上節,將FlinkJedisPoolConfig 從Kafka寫入Redis

上節成功實現了FlinkKafkaConsumer消費Kafka數據&#xff0c;并將數據寫入到控制臺&#xff0c;接下來將繼續將計算的結果輸入到redis中。 pom.xml 引入redis到pom包 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://mave…

git教程-pycharm使用tag打標簽

一.生成tag標簽 前言 當我們的代碼完成了第一階段的需求&#xff0c;版本穩定后&#xff0c;希望能出個穩定版本。于是在 commit 后需要打個 tag 標簽&#xff0c;也就是我們平常說的版本號&#xff0c;如v1.0版本 本篇講解如何使用 pycharm 打 tag 標簽&#xff0c;并推送到…

PHP Error: 深入解析與處理技巧

PHP Error: 深入解析與處理技巧 引言 PHP作為一種廣泛使用的服務器端腳本語言,在Web開發領域占據著重要地位。然而,任何編程語言都難以避免錯誤的發生。本文將深入探討PHP錯誤處理的相關知識,包括錯誤類型、錯誤顯示、錯誤日志以及錯誤處理技巧,幫助開發者更好地應對和解…

21、企業行政辦公(OA)數字化轉型:系統如何重塑企業高效運營新范式

企業行政辦公是營造高效工作環境、提升員工幸福感和歸屬感的重要基石&#xff0c;更是傳遞組織溫度與價值關懷的第一窗口。在數字化轉型浪潮席卷各行各業的今天&#xff0c;企業行政辦公領域正經歷一場靜默但深刻的變革。據統計&#xff0c;采用智能化OA系統的企業&#xff0c;…

基于開源AI智能名片鏈動2+1模式S2B2C商城小程序的抖音渠道力拓展與多渠道利潤增長研究

摘要&#xff1a;在數字化商業競爭日益激烈的背景下&#xff0c;抖音平臺憑借其龐大的流量基礎和興趣電商生態&#xff0c;成為品牌增長的關鍵陣地。渠道力作為品牌增長的核心驅動力&#xff0c;以抖音勢能為內核&#xff0c;通過流量與銷量的外溢效應&#xff0c;可顯著提升品…

基于二維碼的視頻合集高效管理與分發技術

一、 視頻資源聚合的技術挑戰與解決方案 在企業培訓、在線教育和產品展示等場景中&#xff0c;視頻資源的結構化組織與高效分發始終是技術實現的核心挑戰。傳統方案往往面臨三大痛點&#xff1a;資源碎片化導致的管理混亂、多視頻序列播放的用戶體驗不佳、以及跨平臺兼容性問題…

GPT-2論文閱讀:Language Models are Unsupervised Multitask Learners

本文解析 OpenAI 2019 年發布的里程碑式論文&#xff0c;該論文首次提出了 GPT-2 模型&#xff0c;揭示了語言模型作為無監督多任務學習器的革命性潛力。文章的核心觀點是&#xff1a;語言模型在無監督訓練過程中&#xff0c;可以隱式地學習多種任務&#xff0c;無需特定任務微…

R 語言安裝使用教程

一、R 語言簡介 R 是一種用于統計分析、數據挖掘和可視化的編程語言和環境。它在學術界和數據分析領域中廣泛使用&#xff0c;擁有豐富的統計函數庫和繪圖功能。 二、安裝 R 語言 2.1 下載 R 安裝包 前往 CRAN 官網下載適合你操作系統的安裝程序&#xff1a; 官網地址&…

智能Agent場景實戰指南 Day 1:智能Agent概述與架構設計

【智能Agent場景實戰指南 Day 1】智能Agent概述與架構設計 引言 歡迎來到"智能Agent場景實戰指南"系列的第一天&#xff01;今天我們將深入探討智能Agent的基本概念和架構設計。在這個大模型時代&#xff0c;智能Agent已成為連接AI技術與實際業務場景的關鍵橋梁&am…

Plan-Grounded Large Language Models forDual Goal Conversational Settings

Plan-Grounded Large Language Models for Dual Goal Conversational Settings - ACL Anthologyhttps://aclanthology.org/2024.eacl-long.77/ 1. 概述 引導用戶完成諸如烹飪或 DIY 之類的手動任務(Choi 等,2022),對于當前的大型語言模型(LLMs)來說是一個新穎且具有挑戰…

python打卡day57@浙大疏錦行

知識點回顧 序列數據的處理&#xff1a; 處理非平穩性&#xff1a;n階差分處理季節性&#xff1a;季節性差分自回歸性無需處理 模型的選擇 AR(p) 自回歸模型&#xff1a;當前值受到過去p個值的影響MA(q) 移動平均模型&#xff1a;當前值收到短期沖擊的影響&#xff0c;且沖擊影…