RabbitMQ學習-簡單DEMO實現
介紹:
RabbitMQ是一個由erlang開發的基於AMQP(Advanced Message Queue )協議的開源實現。用於在分散式系統中儲存轉發訊息,在易用性、擴充套件性、高可用性等方面都非常的優秀。是當前最主流的訊息中介軟體之一。(官網:http://www.rabbitmq.com)
AMQP,是應用層協議的一個開放標準,為面向訊息的中介軟體設計。訊息中介軟體主要用於元件之間的解耦,訊息的傳送者無需知道訊息使用者的存在,同樣,訊息使用者也不用知道傳送者的存在。AMQP的主要特徵是面向訊息、佇列、路由(包括點對點和釋出/訂閱)、可靠性、安全。
訊息佇列的使用過程大概如下:
(1)客戶端連線到訊息佇列伺服器,開啟一個channel。
(2)客戶端宣告一個exchange,並設定相關屬性。
(3)客戶端宣告一個queue,並設定相關屬性。
(4)客戶端使用routing key,在exchange和queue之間建立好繫結關係。
(5) 客戶端投遞訊息到exchange。exchange接收到訊息後,就根據訊息的key和已經設定的binding,進行訊息路由,將訊息投遞到一個或多個佇列裡。
P: 為Producer,資料的傳送方。
C:為Consumer,資料的接收方。
Exchange:訊息交換機,它指定訊息按什麼規則,路由到哪個佇列。
Queue:訊息佇列載體,每個訊息都會被投入到一個或多個佇列。
Binding:繫結,它的作用就是把exchange和queue按照路由規則繫結起來。
Routing Key:路由關鍵字,exchange根據這個關鍵字進行訊息投遞。
vhost:虛擬主機,一個broker裡可以開設多個vhost,用作不同使用者的許可權分離。
channel:訊息通道,在客戶端的每個連線裡,可建立多個channel,每個channel代表一個會話任務。
搭建環境(Windows)
- 安裝RabbitMQ之前要先安裝Erlang:http://www.erlang.org/download.html
- 之後安裝RabbitMQ:http://www.rabbitmq.com/download.html
- 配置:安裝完以後erlang需要手動設定ERLANG_HOME 的系統變數(setERLANG_HOME=安裝路徑)
- 啟用Rabbit MQ's Management Plugin--Rabbit MQ 管理外掛(可選)
命令列(cmd路徑為rabbitmq安裝目錄的sbin目錄下執行)使用以下命令:rabbitmq-piugins.batenable rabbitmq_management - 建立使用者、密碼、繫結許可權等可用管理外掛也可使用命令列(不多說自己找找)
- 使用瀏覽器開啟 http://localhost:15672訪問Rabbit Mq的管理控制檯,使用剛才建立的賬號登陸系統即可。
開發(C#)
RabbitMQ.Client 是rabbitmq 官方提供的的客戶端
直接建立專案,Nuget安裝RabbitMQ.Client即可
廢話不多說直接上程式碼:
生產者
1 ConnectionFactory connectionFactory = new ConnectionFactory(); 2 connectionFactory.HostName = "localhost"; 3 connectionFactory.UserName = "jason"; 4 connectionFactory.Password = "123456"; 5 6 using (var connection = connectionFactory.CreateConnection()) 7 { 8 using (var channel = connection.CreateModel()) 9 { 10 channel.QueueDeclare("RMQ_DEMO", false, false, false, null);//建立一個名稱為hello的訊息佇列 11 string message = "First Message"; //傳遞的訊息內容 12 var body = Encoding.UTF8.GetBytes(message); 13 channel.BasicPublish("", "hello", null, body); //開始傳遞 14 Console.WriteLine("已傳送: {0}", message); 15 Console.ReadLine(); 16 } 17 }View Code
消費者
1 var factory = new ConnectionFactory(); 2 factory.HostName = "localhost"; 3 factory.UserName = "guest"; 4 factory.Password = "guest"; 5 6 using (var connection = factory.CreateConnection()) 7 { 8 using (var channel = connection.CreateModel()) 9 { 10 channel.QueueDeclare("RMQ_DEMO", false, false, false, null); 11 12 var consumer = new EventingBasicConsumer(channel); 13 channel.BasicConsume("RMQ_DEMO", false, consumer); 14 consumer.Received += (model, ea) => 15 { 16 var body = ea.Body; 17 var message = Encoding.UTF8.GetString(body.ToArray()); 18 Console.WriteLine("已接收: {0}", message); 19 }; 20 Console.ReadLine(); 21 } 22 }View Code