1. 程式人生 > 實用技巧 >RabbitMQ學習-簡單DEMO實現

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)

  1. 安裝RabbitMQ之前要先安裝Erlang:http://www.erlang.org/download.html
  2. 之後安裝RabbitMQ:http://www.rabbitmq.com/download.html
  3. 配置:安裝完以後erlang需要手動設定ERLANG_HOME 的系統變數(setERLANG_HOME=安裝路徑)
  4. 啟用Rabbit MQ's Management Plugin--Rabbit MQ 管理外掛(可選)
    命令列(cmd路徑為rabbitmq安裝目錄的sbin目錄下執行)使用以下命令:rabbitmq-piugins.batenable rabbitmq_management
  5. 建立使用者、密碼、繫結許可權等可用管理外掛也可使用命令列(不多說自己找找)
  6. 使用瀏覽器開啟 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