認識RabbitMQ交換機模型

来源:https://www.cnblogs.com/jian0110/archive/2019/02/16/10389780.html
-Advertisement-
Play Games

前言 RabbitMQ是消息隊列中間件(Message Queue Middleware)中一種,工作雖然有用到,但是卻沒有形成很好的整體包括,主要是一些基礎概念的認識,這裡通過閱讀《RabbitMQ實戰指南》整理筆記併進行代碼實踐,更好地理解RabbitMQ! 本文只通過講解RabbitMQ的一些 ...


前言

 

  RabbitMQ是消息隊列中間件(Message Queue Middleware)中一種,工作雖然有用到,但是卻沒有形成很好的整體包括,主要是一些基礎概念的認識,這裡通過閱讀《RabbitMQ實戰指南》整理筆記併進行代碼實踐,更好地理解RabbitMQ!

本文只通過講解RabbitMQ的一些基礎概念,主要是RabbitMQ的“生產者-消費者”模型涉及到的交換器、路由鍵、綁定鍵、消息路由規則等,下一篇RabbitMQ是如何運轉的?會有簡單介紹RabbitMQ的運轉、RabbitMQ部署,Java代碼實踐。

  需要電子書PDF版《RabbitMQ實戰指南》(高清帶標簽)可以評論或者聯繫我

 


 

一、MQ的作用

  講解RabbitMQ之前先認識下MQ作為消息中間件的作用(優點),使用的時候如果不去思考為什麼用MQ,怎樣更好地才能達到它的作用的話,那都是毫無意義的使用!

    1、解耦:可以很好地屏蔽應用程式及平臺之間的特性,充當中間者,鬆散耦合應用程式及平臺,它們彼此不需要瞭解遠程過程調用RPC與網路協議的細節;

  2、非同步通信:能提供C/S之間同步與非同步連接,在任何時刻都可以將消息進行傳送或者存儲轉發;

    3、可恢復性:當消息接收方宕機或網路不通的情況下,消息轉儲於MQ中,直到網路恢復或接收方恢復再進行轉發;

  4、擴展性:提高消息入隊列和處理效率是容易的,只需要另外增加處理過程即可,不需要改變代碼,也不需要調節參數。

  5、順序性:由於大部分MQ支持隊列模式,自然也就能保證一定的數據處理順序;

  6、緩衝MQ通過一個緩衝層來幫助任務最高效率執行,寫入MQ的處理會儘可能快速。

 

二、RabbitMQ的“交換機”模型

  RabbitMQ整體的模型其實是一種“生產者-消費者”模型,發送消息的一方稱之為生產者,接收消息一方稱之為消費者。中間會有交換器、隊列、Broker等概念。下圖是簡單的RabbitMQ的模型圖(截圖來自於《RabbitMQ實戰指南》,以下截圖同)

 

          

      

  1、生產者-消費者與RabbitMQ Broker 

    (1)Producer:

      投遞消息的一方,創建了消息之後發佈到RabbitMQ中,消息主要包括消息體(Payload)與Label標簽,消息體可以通常是業務數據,比如JSON等,Label則用來表述這條消息,比如一個交換機名稱和一個路由鍵。

生產者把消息交由RabbitMQ,之後會根據標簽把消息發送給感興趣的消費者。

    (2 Consumer:

      消費者,接收消息的一方,連接到RabbitMQ伺服器,並訂閱到隊列上,當消費者消費一條消息時只是消費了消息體payload,在消息路由過程中,消息的標簽會丟失,存入隊列中只有消息體。消費者不需要知道生產者是誰。

    (3)Broker:

      消息中間件的服務節點,一個RabbitMQ Broker可以簡單地看做一個RabbitMQ服務節或者RabbitMQ服務實例(大多數情況下可以看做是一臺RabbitMQ的伺服器

    由上圖可知,消息隊列運轉過程是這樣的:

    封裝好的消息發送(AMQP命令為Basic.publish)到Broker中,消費者訂閱並接收(Basic.Get/Basic.Consume)消息,之後再進行業務邏輯處理(可以再開另外的進程,不需要與接收消息同一個進程)

            

   2、隊列

       RabbitMQ中消息都只能存儲在隊列中,當多個消費者訂閱一個隊列時,隊列中的消息會被平均分攤(Round-Robin),也就是並不是每個消費者都能收到所有的消息並處理。

                

      註意以下幾點:

        1)對於生產者生產的消息到隊列中,並不是平均分攤而是通過路由鍵、綁定鍵、交換器類型三個決定消息最終被哪個消費者消費,之後會介紹!

        2)生產者與消費者之間的連接,並不只是通過隊列那麼簡單連接,而是外加通過TCP連接與通道Channel,之後也會介紹

   3、交換器、路由鍵、綁定   

        (1) 交換器(Exchange, X):由上圖交換機模型圖中看不到交換器這個東西,但實際上是存在的,生產者將消息投遞到隊列,然而真實情況是:生產者將消息發送到Exchange,由Exchange再路由到一個或多個隊列中;

           交換器的類型有fanout、direct、topic、headers這四種類型,不同的類型的交換器有其獨特的匹配規則,這裡的匹配規則其實就是決定消息最終路由到哪的隊列的關鍵,具體請往下看

                  

 

        (2) 路由鍵(RoutingKey):生產者將消息發送給交換器的時候,會指定RoutingKey指定路由規則,實際情況是需要將RoutingKey、交換器類型、綁定鍵聯合使用才能最終生效。當交換器類型與BindingKey固定情況下,通過執行RoutingKey來決定消息流向哪裡。

        (3)綁定(BindingKey):通過綁定鍵將交換器與隊列關聯起來,這樣RabbitMQ就知道如何正確地將消息路由到隊列,其實綁定鍵也是一種路由鍵的一種,不過是用在綁定交換器與隊列的時候。

                

         總結有以下三點:

          (1) 生產者將消息發送給哪個Exchange是需要由RoutingKey決定的,生產者需要將Exchange與哪個隊列綁定時需要由BindingKey決定的(當然還要看交換器類型,BindingKey不一定會生效,如fanout類型交換器);

            (2) 生產者將消息發送給交換器時,需要一個RoutingKey,當BindingKey和RoutingKey相匹配時,消息會被路由到對象的隊列中(當然也要看交換器類型)。

            (3)  BindingKey其實也屬於路由鍵的一種,在使用邦定的時候,需要的路由鍵是BingdingKey,在發送消息的時,需要的路由鍵是RoutingKey

   4、交換器類型

        為什麼非要介紹交換器類型呢?上文中也提到過交換器類型關係到具體的消息路由途徑,處路由鍵、綁定鍵之外的還需要關註交換器的類型。不同的交換器會有不同的匹配規則。

        RabbitMQ常用的交換器類型有fanout、direct、topic、headers這四種類型

        (1)fanout它會把所有的交換器上的消息路由到所有與該交換器邦定的隊列中,不需要BindingKey生效

        (2)direct:它會把消息路由到BindingKey與RoutingKey完全匹配的隊列中。比如在發送消息的時候,設置Label中RoutingKey為warning,則消息會路由到Queue1與Queue2上(請看下圖)。

                

  

        (3)topic:是direct上的擴展,同樣是利用RoutingKey與BindingKey相匹配,但是匹配規則不一樣,支持模糊匹配有如下的規則

          • RoutingKey為一個點號“.”分隔的字元串,每個被隔開的獨立字元串即為一個單詞,是匹配的單位;
          • BindingKey和RoutingKey一樣,也是"."分割的字元串;
          • 但不同的是BindingKey,可以用“#”,“*”進行類似於占位符的模糊匹配,“#”表示一個單詞,"*"表示多個單詞(也可以是零個)                 

          比如:

            RoutingKey為com.hidden.client的消息只會到隊列Queue2中:因為只有Queue2的BindingKey=*.*.client匹配com.hidden.client

            RoutingKey為com.rabbitmq.client的消息會到隊列Queue1-2中: 因為Queue1的BindingKey=*.rabbitmq.*.匹配com.rabbitmq.client,Queue2的BindingKey=*.*.client匹配com.rabbitmq.client

            RoutingKey為java.rabbitmq.demo的消息只會到隊列Queue1中:因為只有Queue1的BindingKey=*.rabbitmq.*.匹配java.rabbitmq.demo

            RoutingKey為java.util.concurrent的消息會被丟棄或者返回給生產者(需要設置)

                 

 

        (4)headers:依賴發送消息內容中的hearders屬性進行匹配,在綁定隊列和交換器時指定一組鍵值對,這裡的也就是headers,當發送消息到交換器時,RabbitMQ會獲取到該消息的headers,通過比較會路由到相關隊列中,這種交換器性能會很差,一般不會使用。

 

 


        

     以上內容總結起來只是介紹了RabbitMQ的從生產者產生消息到消費者消費消息過程中涉及到的概念。還未介紹具體的RabbitMQ是如何運轉的,比如生產者是怎樣建立連接生成消息的,消費者又是怎樣讀取消息的,這將是下一篇RabbitMQ是如何運轉的?主要介紹的。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.字體圖標 1.字體圖標都是用svg圖片 1.svg圖片不失真 2.svg圖標由設計師提供 3.為了減少網路請求,會把svg圖標轉換成字體圖標,放到字體文件中,通過字體庫的方式使用 1.svg圖片不失真 2.svg圖標由設計師提供 3.為了減少網路請求,會把svg圖標轉換成字體圖標,放到字體文件中 ...
  • javascript加密字元串,md5加密庫,sha1加密庫 下載鏈接: 鏈接:https://pan.baidu.com/s/10pkLUZAWr6_mRHEx51Z5Vg 提取碼:xz8e ...
  • directory "代碼已上傳github, 地址" Detailed Webpack 就像一條生產線, 要經過一系列的處理流程才能將源文件轉換成輸出結果。這條生產線上的每個流程都是單一的, 多個流程之間存在依賴關係。只能完成當前處理後才會轉交到下一個流程。 插件就像一個插入到生產線中的一個功能, ...
  • 官網: 沒有賬號可以先註冊一個,右上角點擊“Sign Up",有賬號直接點擊“Login” 註冊與登錄賬號這些就不詳說了,不懂直接重新學習吧!!!!!!!! 打開終端:win+r 登錄命令:npm login查找用戶名命令:npm whoami 要上傳npm包步驟:1.先初始化npm包:npm in ...
  • Failed to execute 'setLocalDescription' on 'RTCPeerConnection': Failed to parse SessionDescription. a=msid: Missing track ID in msid attribute. ...
  • docker簡介 Docker 是一個開源的應用容器引擎,基於 Go 語言 並遵從Apache2.0協議開源。Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然後發佈到任何流行的 Linux 機器上,也可以實現虛擬化。 在Linux上安裝Docker;1.輸入yum ...
  • 分散式緩存Hazelcast案例一Hazelcast IMDG Architecture 今天先到這兒,希望對您技術領導力, 企業管理,物聯網, 系統架構設計與評估,團隊管理, 項目管理, 產品管理,團隊建設 有參考作用 , 您可能感興趣的文章: 2017-2018年Scrum狀態調查報告2016年... ...
  • collections模塊 namedtuple #命名元組 #生成可以使用名字來訪問元素內容的tuple from collections import namedtuple Point = namedtuple('point',['x','y']) #一個點的命名元組 p = Point(1,2... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...