RabbitMQ入門-理論
目錄
- 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
- RoutingKey:是RabbitMQ實現路由分發到各個隊列的規則,並結合Binging提供於Exchange使用將消息推送入隊列;
Queue:是消息隊列,可以根據需要定義多個隊列,設置隊列的屬性,比如:消息移除、消息緩存、回調機制等設置,實現與Consumer通信;
消息消費者(Consumer):主要負責消費Queue的消息,同樣基於TCP協議,通過建立Connection和Channel與Queue傳輸消息,一個消息可以給多個Consumer消費;
關鍵名詞說明:Connection、Channel、Binging等;
Connection:是建立客戶端與服務端的連接。
Channel:是基於Connection之上建立通信通道,因為每次Connection建立TCP協議通信開銷及性能消耗較大,所以一次建立Connection後,使用多個Channel通道通信減少開銷和提高性能。
Binging:是一個捆綁定義,將exchange和queue捆綁,定義routingkey相關策略。
RabbitMQ安裝
因為RabbitMQ由Erlang實現,本機部署的話還要首先安裝Erlang的開發環境。然而借助Docker的話,環境部署便會非常便捷。這裏來使用docker快速搭建帶web管理功能的RabbitMQ的環境。
Docker官方鏡像地址
- 查找鏡像
#查找tag為management的rabbitmq鏡像
docker search rabbitmq:management
- 獲取鏡像
docker pull rabbitmq:management
如果docker pull rabbitmq 後面不帶management,啟動rabbitmq後是無法打開管理界面的.
- 運行鏡像
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工作原理如下:
- 當客戶端啟動的時候,它創建一個匿名獨享的回調隊列。
- 在RPC請求中,客戶端發送帶有兩個屬性的消息:一個是設置回調隊列的 reply_to 屬性,另一個是設置唯一值的 correlation_id 屬性。
- 將請求發送到一個 rpc_queue 隊列中。
- RPC工作者(又名:服務器)等待請求發送到這個隊列中來。當請求出現的時候,它執行他的工作並且將帶有執行結果的消息發送給reply_to字段指定的隊列。
- 客戶端等待回調隊列裏的數據。當有消息出現的時候,它會檢查correlation_id屬性。如果此屬性的值與請求匹配,將它返回給應用。
示例代碼
github
參考
- .NET Core 使用RabbitMQ
- 部署帶Web管理工具的RabbitMQ
- Net分布式系統之四:RabbitMQ消息隊列應用
- http://rabbitmq.mr-ping.com/
RabbitMQ入門-理論