1. 程式人生 > >RabbitMQ入門-理論

RabbitMQ入門-理論

arc gem protocol 環境部署 mpp rip bin 緩存 精確匹配

目錄

  • RabbitMQ簡介
  • RabbitMQ原理簡介
  • RabbitMQ安裝
  • .NET Core 使用 RabbitMQ
    • Hello World
    • 工作隊列
    • 扇型交換機
    • 直連交換機
    • 主題交換機
    • 遠程過程調用
  • 示例代碼
  • 參考

RabbitMQ簡介

AMQP,即Advanced Message Queuing Protocol,高級消息隊列協議,是應用層協議的一個開放標準,為面向消息的中間件設計。消息中間件主要用於組件之間的解耦,消息的發送者無需知道消息使用者的存在,反之亦然。

AMQP的主要特征是面向消息、隊列、路由(包括點對點和發布/訂閱)、可靠性、安全。
RabbitMQ是一個開源的AMQP實現,服務器端用Erlang語言編寫,支持多種客戶端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用於在分布式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。

RabbitMQ提供了可靠的消息機制、跟蹤機制和靈活的消息路由,支持消息集群和分布式部署。適用於排隊算法、秒殺活動、消息分發、異步處理、數據同步、處理耗時任務、CQRS等應用場景。

RabbitMQ原理簡介

技術分享圖片

RabbitMQ中間件分為服務端(RabbitMQ Server)和客戶端(RabbitMQ Client),服務端可以理解為是一個消息的代理消費者,客戶端又分為消息生產者(Producer)和消息消費者(Consumer)。

  1. 消息生產者(Producer):主要生產消息並將消息基於TCP協議,通過建立Connection和Channel,將消息傳輸給RabbitMQ Server,對於Producer而言基本就完成了工作。

  2. 服務端(RabbitMQ Server):主要負責處理消息路由、分發、入隊列、緩存和出列。主要由三部分組成:Exchange、RoutingKey、Queue。

  • Exchange:用於接收消息生產者發送的消息,有三種類型的exchange:direct, fanout,topic,不同類型實現了不同的路由算法;

    • direct exchange:將與routing key 比配的消息,直接推入相對應的隊列,創建隊列時,默認就創建同名的routing key。

    • fanout exchange:是一種廣播模式,忽略routingkey的規則。

    • topic exchange:應用主題,根據key進行模式匹配路由,例如:若為abc則推入到所有abc

      相對應的queue;若為abc.#則推入到abc.xx.one ,abc.yy.two對應的queue。

  • RoutingKey:是RabbitMQ實現路由分發到各個隊列的規則,並結合Binging提供於Exchange使用將消息推送入隊列;
  • Queue:是消息隊列,可以根據需要定義多個隊列,設置隊列的屬性,比如:消息移除、消息緩存、回調機制等設置,實現與Consumer通信;

  1. 消息消費者(Consumer):主要負責消費Queue的消息,同樣基於TCP協議,通過建立Connection和Channel與Queue傳輸消息,一個消息可以給多個Consumer消費;

  2. 關鍵名詞說明:Connection、Channel、Binging等;

  • Connection:是建立客戶端與服務端的連接。

  • Channel:是基於Connection之上建立通信通道,因為每次Connection建立TCP協議通信開銷及性能消耗較大,所以一次建立Connection後,使用多個Channel通道通信減少開銷和提高性能。

  • Binging:是一個捆綁定義,將exchange和queue捆綁,定義routingkey相關策略。

RabbitMQ安裝

因為RabbitMQ由Erlang實現,本機部署的話還要首先安裝Erlang的開發環境。然而借助Docker的話,環境部署便會非常便捷。這裏來使用docker快速搭建帶web管理功能的RabbitMQ的環境。

Docker官方鏡像地址

  1. 查找鏡像
#查找tag為management的rabbitmq鏡像
docker search rabbitmq:management
  1. 獲取鏡像
docker pull rabbitmq:management

如果docker pull rabbitmq 後面不帶management,啟動rabbitmq後是無法打開管理界面的.

  1. 運行鏡像
docker run -d --name rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 25672:25672 -p 15671:15671 -p 15672:15672 rabbitmq:management

管理界面的默認端口是15672。同時默認創建了一個guest 用戶,密碼也是guest。

.NET Core 使用 RabbitMQ

Hello World

生產者(producer)把消息發送到一個名為“hello”的隊列中。消費者(consumer)從這個隊列中獲取消息。
技術分享圖片

工作隊列

工作隊列是為了避免等待一些占用大量資源或時間的操作。當我們把任務當作消息發送到隊列中,一個或多個工作者會取出任務輪詢處理。
技術分享圖片

扇型交換機

扇型交換機不需要設置路由鍵,它會把消息發送給綁定在它上面的所有隊列。類似於廣播。

技術分享圖片

直連交換機

直連交換機對綁定鍵和路由鍵進行精確匹配,從而確定消息該分發到哪個隊列。相比於扇形交換機盲目的廣播消息,直連交換改進為可以選擇性的接收。
技術分享圖片

主題交換機

主題交換機的路由鍵必須是一個由.分隔開的詞語列表。綁定鍵擁有相同的格式,但可以用*表示一個單詞或者用# 用來表示任意數量(零個或多個)的單詞。通過模式匹配可以基於多個標準執行路由操作。

主題交換機是很強大的,它可以表現出跟其他交換機類似的行為

當一個隊列的綁定鍵為 "#"(井號)
的時候,這個隊列將會無視消息的路由鍵,接收所有的消息。

當 * (星號) 和 # (井號) 這兩個特殊字符都未在綁定鍵中出現的時候,此時主題交換機就擁有的直連交換機的行為。

技術分享圖片

遠程過程調用

RPC工作原理如下:

  1. 當客戶端啟動的時候,它創建一個匿名獨享的回調隊列。
  2. 在RPC請求中,客戶端發送帶有兩個屬性的消息:一個是設置回調隊列的 reply_to 屬性,另一個是設置唯一值的 correlation_id 屬性。
  3. 將請求發送到一個 rpc_queue 隊列中。
  4. RPC工作者(又名:服務器)等待請求發送到這個隊列中來。當請求出現的時候,它執行他的工作並且將帶有執行結果的消息發送給reply_to字段指定的隊列。
  5. 客戶端等待回調隊列裏的數據。當有消息出現的時候,它會檢查correlation_id屬性。如果此屬性的值與請求匹配,將它返回給應用。
    技術分享圖片

示例代碼

github

參考

  • .NET Core 使用RabbitMQ
  • 部署帶Web管理工具的RabbitMQ
  • Net分布式系統之四:RabbitMQ消息隊列應用
  • http://rabbitmq.mr-ping.com/

RabbitMQ入門-理論