RabbitMQ的交換機和隊列概念


🏪 場景:一個外賣平臺的后臺系統

假設你開了一家在線外賣平臺:

  • 飯店是消息的生產者(Producer)
  • 顧客是消息的消費者(Consumer)
  • 你開的外賣平臺就是RabbitMQ消息系統

🔁 第一部分:核心概念解析

📦 1. 隊列(Queue)—— 外賣存放柜

[ 隊列就像小區門口的快遞柜 ]
┌──────────────┐
│   隊列(Queue)  │
│  ┌────────┐  │
│  │ 訂單1  │  │<--- 騎手放外賣
│  ├────────┤  │
│  │ 訂單2  │  │
│  ├────────┤  │
│  │ 訂單3  │  │---> 顧客取外賣
│  └────────┘  │
└──────────────┘
  • 作用:臨時存儲消息(外賣訂單)的容器
  • 特點
    • 先進先出(先放的訂單先被處理)
    • 可以持久化(斷電重啟訂單不丟失)
    • 可設置容量限制(防止爆單)

🔀 2. 交換機(Exchange)—— 智能分揀中心

[ 交換機像外賣平臺的調度中心 ]┌──────────────┐餐廳送來訂單 ─>│  交換機       │─> 根據訂單地址分發│ (Exchange)   │└──────┬───────┘│┌──────────────▼──────────────┐│      不同小區的快遞柜        │├───────────┬─────────┬────────┤│ 浦東隊列  │ 浦西隊列 │ 松江隊列│└───────────┴─────────┴────────┘
  • 作用:接收消息,并根據路由規則發給對應隊列
  • 核心工作
    // 偽代碼:交換機的工作邏輯
    void handleMessage(Message msg) {if (是廣播消息) 發送給所有隊列;       // Fanout模式else if (匹配路由鍵) 發到指定隊列;   // Direct模式else if (模糊匹配) 發到多個隊列;     // Topic模式
    }
    

🔧 第二部分:交換機類型和業務場景

1?? 直連交換機(Direct Exchange)—— 精準配送

[ 定向配送場景 ]┌────────┐支付消息 ─>│ 交換機 ├───> [支付隊列] → 財務系統└───┬────┘└─────> [訂單隊列] → 訂單系統(路由鍵:order)
  • 適用場景:訂單狀態更新、支付通知
  • 代碼綁定
    // 綁定隊列到交換機,并指定路由鍵
    channel.queueBind("支付隊列", "訂單交換機", "payment");
    channel.queueBind("訂單隊列", "訂單交換機", "order");
    

2?? 扇形交換機(Fanout Exchange)—— 小區廣播

[ 小區通知場景 ]┌─────────────┐物業通知─>│  廣播交換機 ├───> [1號樓快遞柜] └──────┬──────┘├───> [2號樓快遞柜]└───> [3號樓快遞柜]
  • 適用場景:系統公告、群發消息
  • 特點:無視路由鍵,消息直接復制到所有綁定隊列

3?? 主題交換機(Topic Exchange)—— 智能分類

[ 根據標簽定向推送 ]┌─────────┐新聞"體育.NBA" ───> │ 交換機  ├─> [體育隊列] (*.NBA)└───┬─────┘└───> [熱點隊列] (熱點.*) 
  • 路由鍵規則
    • * 匹配1個詞(如 天氣.上海天氣.*
    • # 匹配0或多個詞(如 新聞.體育.NBA新聞.#
  • 場景:新聞分類、日志分級收集

🧩 第三部分:完整消息流轉流程

 飯店(生產者)                    顧客(消費者)│                             ▲│ 1.下訂單                     │ 6.吃外賣▼                             │
┌─────────────────┐               ┌────────────┐
│  外賣平臺交換機  │ 3.放指定格子     │  隊列      │
│  (Exchange)     ├─────┬───────> │ (Queue)    │
└─────────────────┘     │         └────────────┘│      │2.通知調度中心       │ 4.查看待取外賣│     ┌▼───────────────────┐ │ 5.從柜子取外賣└─────┤  綁定規則          ├─┘│ (queueBind路由規則)│└───────────────────┘

💻 對應代碼示例

// 1. 飯店聲明交換機 (類似開通分店渠道)
channel.exchangeDeclare("訂單交換機", "direct");// 2. 物業聲明隊列 (類似安裝外賣柜)
channel.queueDeclare("浦東外賣柜", true, false, false, null);// 3. 建立綁定關系 (類似設置配送范圍)
channel.queueBind("浦東外賣柜", "訂單交換機", "pudong");// 4. 飯店發送訂單
channel.basicPublish("訂單交換機", "pudong", null, "魚香肉絲飯".getBytes());// 5. 顧客監聽自己的外賣柜
channel.basicConsume("浦東外賣柜", true, (consumerTag, delivery) -> {System.out.println("收到外賣: " + new String(delivery.getBody()));
}, consumerTag -> {});

📌 關鍵總結

概念現實比喻核心作用開發者注意事項
交換機外賣調度中心決定消息去哪(不存消息)必須選擇正確的交換機類型
隊列小區快遞柜臨時存消息要配置持久化/長度限制/消費者數量
綁定外賣柜安裝位置對應表建立交換機和隊列映射關系路由鍵是消息分類的關鍵標簽

?? 易錯點提醒
很多初學者直接發消息到隊列(不經過交換機),相當于飯店把外賣直接塞進某個快遞柜 —— 可以運行但失去靈活性!正規做法是通過交換機路由,后續拓展才方便。

現在再回頭看你的代碼:

// 創建隊列(相當于安裝一個快遞柜)
channel.queueDeclare("訂單隊列", true, false, false, null); 

就明白這個快遞柜的特性:

  • true:耐用的柜子(服務器重啟訂單還在)
  • false:不獨占(多個騎手能同時投遞)
  • false:有人用時不會自動拆除
  • null:不需要特殊參數

要真正啟用它,還需要綁定到一個交換機!就像是告訴調度中心"這個柜子接收浦東地區的外賣訂單"。

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

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

相關文章

德國馬克斯·普朗克數學研究所:幾何朗蘭茲猜想

2025年科學突破獎 4月5日在美國洛杉磯揭曉&#xff1a;數學突破獎&#xff1a;德國馬克斯普朗克數學研究所&#xff1a;幾何朗蘭茲猜想 德國馬克斯普朗克數學研究所&#xff08;Max Planck Institute for Mathematics, MPIM&#xff09;在幾何朗蘭茲猜想的研究中扮演了核心角色…

TerraFE 腳手架開發實戰系列(一):項目架構設計與技術選型

TerraFE 腳手架開發實戰系列&#xff08;一&#xff09;&#xff1a;項目架構設計與技術選型 前言 在前端開發中&#xff0c;項目初始化往往是一個重復且繁瑣的過程。每次新建項目都需要配置 webpack、安裝依賴、設置目錄結構等&#xff0c;這些重復性工作不僅浪費時間&#…

準確--CentOS 7.9在線安裝docker

一、安裝Docker前的準備工作 操作系統版本為CentOS 7.9&#xff0c;內核版本需要在3.10以上。確保能夠連通互聯網&#xff0c;為避免網絡異常&#xff0c;建議關閉Linux的防火墻&#xff08;生產環境下請根據實際情況設置防火墻出入站規則&#xff09;。 # 查看內核版本 sudo…

中興B860AV1.1強力降級固件包

中興B860AV1.1強力降級固件包 關于中興b860av1.1頑固盒子降級教程終極版 將附件解壓好以后&#xff0c;準備一個8G以下的U盤重新格式化為FAT32格式后&#xff0c;并插入電腦 將以下文件及文件夾一同復制到優盤主目錄下&#xff08;見下圖&#xff09; 全選并復制到U盤主目錄下&…

nacos-作為注冊中心與springcloud整合(三)

前一篇文章nacos-簡介和初體驗&#xff08;一&#xff09;我們已經在服務器部署了nacos應用了。 在另外一篇文章中nacos-作為配置中心與springcloud整合&#xff08;二&#xff09;已經作為配置中心整合到springcloud 接下來讓我們嘗試把nacos作為注冊中心和springcloud中整合&…

Seata的TC(事務協調器)高可用如何實現?

Seata的TC&#xff08;事務協調器&#xff09;確實運行在Seata服務進程中&#xff0c;其高可用實現和宕機恢復主要通過以下機制實現&#xff1a; 一、高可用架構 集群部署 多TC節點組成集群&#xff0c;通過注冊中心&#xff08;如Nacos&#xff09;實現服務發現采用Raft協議實…

Mac安裝docker desktop

一、背景 最近在學習Spring AI&#xff0c;于是在GitHub上找了個開源項目&#xff0c;個人覺得還是比較適合有Java基礎和AI基礎的同學學習的。GitHub地址如下&#xff1a; https://github.com/qifan777/dive-into-spring-ai 但是看了下運行環境需要 MySQL 8 Redis-Stack n…

【算法深練】二分答案:從「猜答案」到「精準求解」的解題思路

目錄 前言 二分求最小值 1283. 使結果不超過閾值的最小除數 2187. 完成旅途的最少時間 1011. 在 D 天內送達包裹的能力 875. 愛吃香蕉的珂珂 3296. 移山所需的最少秒數 475. 供暖器 2594. 修車的最少時間 1482. 制作 m 束花所需的最少天數 3048. 標記所有下標的最早秒…

基于RK3588,飛凌教育品牌推出嵌入式人工智能實驗箱EDU-AIoT ELF 2

在AIoT技術驅動產業變革的浪潮中&#xff0c;嵌入式人工智能已成為工業物聯網、智慧交通、智慧醫療等領域創新突破的關鍵引擎。飛凌嵌入式教育品牌ElfBoard立足產業前沿&#xff0c;重磅推出嵌入式人工智能實驗箱EDU-AIoT ELF 2&#xff0c;以“軟硬協同、產教融合”為設計理念…

51單片機-IO擴展模塊 pcf8575

PCF8575介紹 PCF8575 是 NXP&#xff08;原飛利浦半導體&#xff09;生產的一款通用 IC 總線 I/O 擴展器芯片&#xff0c;主要用于微控制器&#xff08;如 Arduino、STM32 等&#xff09;的 I/O 端口擴展。 主要特性 16位并行 I/O 端口&#xff1a;可以配置為輸入或輸出 IC 總…

Python3 學習(菜鳥)-02基本數據類型

1.多變量賦值 多變量被賦予相同的數值 多變量被賦予不同的數值 2.數值運算 除法 /&#xff1a;返回一個浮點數 除法 //&#xff1a;返回一個整數 3.列表 加號和星號 加號 是列表連接運算符 星號 * 是重復操作 list [ abcd, 786 , 2.23, runoob, 70.2 ] # 定義一個…

『uniapp』搜索功能+商品列表滾動效果(詳細圖文注釋)

目錄 預覽效果準備工作代碼分析與思路1. 頁面結構主容器:`menber-container`搜索框:`u-search-inner`菜單:`u-menu-wrap`2. 數據模型`data()` 中的數據定義:3. 生命周期`onLoad(options)``onReady()``mounted()`4. 方法`search()``searchClear()``swichMenu(index)``getElRe…

微服務--消息隊列mq

1. mq簡介 消息隊列是分布式系統中的異步通信中間件&#xff0c;采用"生產者-消費者"模型實現服務間解耦通信 核心作用 服務解耦異步處理流量削峰數據同步最終一致性 消息隊列模式 發布/訂閱模式&#xff1a;一對多廣播工作隊列模式&#xff1a;競爭消費死信隊列…

第26節 Node.js 事件

Node里很多對象會分發事件&#xff1a; 每次有連接的時候net.Server會分發事件&#xff0c;當文件打開的時候fs.readStream會分發事件。所有能分發事件的對象都是 events.EventEmitter的實例。通過require("events");能訪問這個模塊。 一般來說&#xff0c;事件名都…

LangChain + MCP + vLLM + Qwen3-32B 構建本地私有化智能體應用

一、私有化智能體應用 在本專欄的前面文章基于Spring AI MCP實現了本地 ChatBI 問答應用&#xff0c;本文還是依據該場景&#xff0c;采用 LangChain vLLM Qwen3-32B MCP 技術棧構建該流程&#xff0c;整體過程如下圖所示&#xff1a; 實現效果如下所示&#xff1a; 關于 M…

AKS升級路線最佳實踐方案

前言 Kubernetes 社區大約每 4 個月發布次要版本&#xff0c;次要版本包括新增功能和改進。補丁發布更為頻繁&#xff08;有時每周都會發布&#xff09;&#xff0c;適用于次要版本中的關鍵 Bug 修復。修補程序版本包括針對安全漏洞或主要 bug 的修復。對于受支持版本列表以…

樹莓派智能小車基本移動實驗指導書

1.安裝LOBOROBOT庫函數 LOBOROBOT.py代碼如下&#xff1a; #!/usr/bin/python # -*- coding: utf-8 -*-import time import math import smbus import RPi.GPIO as GPIODir [forward,backward, ]class PCA9685:# Registers/etc.__SUBADR1 0x02__SUBADR2 …

如何對目標檢測算法RT-DETR進行創新和改進:突破瓶頸,提升性能!

更多精彩&#xff0c;詳見文末~~~ 在目標檢測的高速發展中&#xff0c;RT-DETR作為DETR&#xff08;DEtection TRansformer&#xff09;的高效變體&#xff0c;憑借其優異的性能和較快的推理速度&#xff0c;已經成為許多實際應用中的首選算法。然而&#xff0c;盡管RT-DETR在…

Java-String

前言 package com.kjxy.st;public class TestString1 {public static void main(String[] args) {String s1 "hello";String s2 "hello";String s3 new String("hello");String s4 new String("hello");System.out.println(s1 s2…

計算機組成原理——C/存儲系統

&#x1f308;個人主頁&#xff1a;慢了半拍 &#x1f525; 創作專欄&#xff1a;《史上最強算法分析》 | 《無味生》 |《史上最強C語言講解》 | 《史上最強C練習解析》|《史上最強C講解》|《史上最強計組》|《史上最強數據結構》 &#x1f3c6;我的格言&#xff1a;一切只是時…