簡介 RabbitMQ:一個消息系統,基於 AMQP 系統協議,由 erlang 語言開發。 優點:健壯、使用簡單、開源和支持各種流行的語言等。 MQ(Message Queue):消息隊列的簡稱,是一種應用程式之間的通信機制。 作用:將部分無需立即回調獲取結果,並且耗時的操作,使用非同步處理的方式提 ...
簡介
RabbitMQ:一個消息系統,基於 AMQP 系統協議,由 erlang 語言開發。
優點:健壯、使用簡單、開源和支持各種流行的語言等。
MQ(Message Queue):消息隊列的簡稱,是一種應用程式之間的通信機制。
作用:將部分無需立即回調獲取結果,並且耗時的操作,使用非同步處理的方式提高伺服器的吞吐量及性能。
簡單的通信方式:
![](http://images2015.cnblogs.com/blog/711762/201702/711762-20170225180101257-1562087567.png)
![](http://images2015.cnblogs.com/blog/711762/201702/711762-20170225180234632-32448971.png)
圖2 加入 MQ 的通信方式
A 端:生產者將消息寫(插)入隊列; MQ(隊列) :中間件,消息的載體; B 端:消費者從隊列讀(取)出消息。 MQ 特點:消費者 - 生產者模型的一種表現形式。環境搭建
1.先上官網下載安裝包:http://www.rabbitmq.com/ ;
2.安裝時會提示你下載 Erlang 語言環境;
3.啟動安裝完的服務:RabbitMQ;
4.在 cmd 中指向 sbin 目錄,並輸入以下命令,才能打開 WEB 管理界面:
rabbitmq-plugins enable rabbitmq_management
5.預設路徑:http://localhost:15672/#/
名詞解析:
Exchange:交換機,制定路由規則,控制消息的傳輸; Queue:消息隊列,消息的載體。 Channel:消息通道 ,進行消息讀寫的通道,在客戶端的每個連接里,可建立多個channel,每個channel代表一個會話任務; Bind:根據路由規則綁定 Queue 和 Exchange,意即為符合什麼樣路由規則的消息,將會進入哪一個 Queue; Broker:MQ 伺服器實體。 Exchange:消息交換機,它指定消息按什麼規則,路由到哪個隊列。 Routing Key:路由關鍵字,exchange根據這個關鍵字進行消息投遞。 Producer:生產者,消息投放者。 Consumer:消費者,消息接收者。簡單的 Hello World
P(Producer):生產者,意味著發送;
Queue:隊列,本質上是一個無限的緩衝區,可以儲存儘可能多的信息;
C(Consumer):消費者,等待並接收消息。
【備註】生產者和消費者不需要駐留在同一臺伺服器上。
Producer.cs
1 public class Producer 2 { 3 public static void Send() 4 { 5 var factory = new ConnectionFactory { HostName = "localhost" }; 6 7 //創建連接對象,基於 Socket 8 using (var connection = factory.CreateConnection()) 9 { 10 //創建新的渠道、會話 11 using (var channel = connection.CreateModel()) 12 { 13 //聲明隊列 14 channel.QueueDeclare(queue: "hello", //隊列名 15 durable: false, //持久性 16 exclusive: false, //排他性 17 autoDelete: false, //自動刪除 18 arguments: null); 19 20 const string message = "Hello World!"; 21 var body = Encoding.UTF8.GetBytes(message); 22 23 channel.BasicPublish(exchange: "", //交換機名 24 routingKey: "hello", //路由鍵 25 basicProperties: null, 26 body: body); 27 } 28 } 29 } 30 }
【備註】隊列名如果已存在,將不會重覆創建。假設隊列已存在,修改 channel.QueueDeclare() 方法內的參數後啟動會出現異常。
【備註】消息內容是一個位元組數組。
Consumer.cs1 class Consumer 2 { 3 public static void Receive() 4 { 5 var factory = new ConnectionFactory() { HostName = "localhost" }; 6 7 using (var connection = factory.CreateConnection()) 8 { 9 using (var channel = connection.CreateModel()) 10 { 11 channel.QueueDeclare(queue: "hello", 12 durable: false, 13 exclusive: false, 14 autoDelete: false, 15 arguments: null); 16 17 //創建基於該隊列的消費者,綁定事件 18 var consumer = new EventingBasicConsumer(channel); 19 consumer.Received += (model, ea) => 20 { 21 var body = ea.Body; //消息主體 22 var message = Encoding.UTF8.GetString(body); 23 Console.WriteLine(" [x] Received {0}", message); 24 }; 25 26 //啟動消費者 27 channel.BasicConsume(queue: "hello", //隊列名 28 noAck: true, //false:手動應答;true:自動應答 29 consumer: consumer); 30 31 Console.Read(); 32 } 33 } 34 } 35 }
在消費者的類裡面為什麼會再次聲明隊列(channel.QueueDeclare)呢?因為接收方可能會在發送方啟動前啟動,這是出於保險起見。
【博主】反骨仔 【原文】http://www.cnblogs.com/liqingwen/p/6412089.html