如何在 C# 中使用 RabbitMQ

譯文連接: https://www.infoworld.com/art...

RabbitMQ 是一個很是流行的,開源的,使用Erlang語言編寫的框架,一般在電信級平臺中做爲消息中間件使用,RabbitMQ實現了高級的AMQP協議用於實現進程間,應用程序間,服務器之間的消息交互,並且它還有一個很是🐂👃的特性,你可使用自定義插件來擴展RabbitMQ的功能,並且它還支持多協議,高性能,高可靠,集羣以及高可用隊列。html

建立隊列的方式也多種多樣,你能夠編碼建立,也能夠經過管理員用戶界面,甚至經過 PowerShell 進行隊列建立。git

RabbitMQ 術語

當你在用 RabbitMQ 時,你要理解下面兩個術語github

  • 隊列是一個數據結構上的概念,支持 FIFO 特性,在本文中,消息隊列就是一個能夠存放消息的巨大緩存。
  • producer(生產者) 的使命是生成數據並推送到隊列的一種角色組件,consumer(消費者)它可以從存儲消息的隊列中提取數據進行消費,生產者-消費者 是並行編程中很是流行的設計模式之一。

安裝和啓動

安裝 RabbitMQ 是很是簡單的,在安裝以前,你須要先安裝 Erlang,根據你的操做系統選擇正確版本呢的 Erlang,下載地址:https://www.erlang.org/downloads ,而後繼續下載安裝 RabbitMQ Server ,下載地址: https://www.rabbitmq.com/down...編程

用 C# 構建 RabbitMQ

如今 Erlang 和 RabbitMQ 已經成功安裝到你的windows上,若是想和 Rabbitmq Server 進行交互,你須要安裝一個 RabbitMQ .NET client , 能夠用 NuGet Package Manager 控制檯去安裝 RabbitMQ Client。windows

在 Visual Studio 中新建一個 Console Application,而後經過 NuGet Package Manager 安裝 RabbitMQ.Client 開發包,假定 RabbitMQ Server 是運行在本機,下面的代碼片斷建立了一個和 RabbitMQ Server 交互的 Connection 鏈接,代碼以下:設計模式

ConnectionFactory connectionFactory = new ConnectionFactory();
IConnection connection = connectionFactory.CreateConnection();

如今再次假定 RabbitMQ 跑在遠程服務器上,下面的方法返回了一個通往 Rabbitmq Service 的 Connection 鏈接。緩存

public IConnection GetConnection(string hostName, string userName, string password)
        {
            ConnectionFactory connectionFactory = new ConnectionFactory();
            connectionFactory.HostName = hostName;
            connectionFactory.UserName = userName;
            connectionFactory.Password = password;
            return connectionFactory.CreateConnection();
        }

發送和接收消息

如今 RabbitMQ Service 已經在本地正常運行,使用下面的方法向隊列發送消息,請注意通往 RabbitMQ Service 的 Connection 用的是默認配置。服務器

public static void Send(string queue, string data)
        {
            using (IConnection connection = new ConnectionFactory().CreateConnection())
            {
                using (IModel channel = connection.CreateModel())
                {
                    channel.QueueDeclare(queue, false, false, false, null);
                    channel.BasicPublish(string.Empty, queue, null, Encoding.UTF8.GetBytes(data));
                }
            }
        }

channel 經常使用於和 server 進行通信從而發送和接收消息,不過上面這種隊列是不持久的,爲啥這麼說呢?由於我在 QueueDeclare 方法的第二個參數中設置了 false,因此送往這個 queue 的 message 只會存留於內存中,一旦 server 重啓,這個數據將會丟失。數據結構

下面的代碼展現瞭如何從 queue 中消費數據。框架

public static void Receive(string queue)
        {
            using (IConnection connection = new ConnectionFactory().CreateConnection())
            {
                using (IModel channel = connection.CreateModel())
                {
               channel.QueueDeclare(queue, false, false, false, null);
               var consumer = new EventingBasicConsumer(channel);
               BasicGetResult result = channel.BasicGet(queue, true);
                    if (result != null)
                    {
                      string data =
                      Encoding.UTF8.GetString(result.Body);
                        Console.WriteLine(data);
                    }
                }
            }
        }

接下來的代碼片斷展現瞭如何使用 Send 和 Receive 方法進行數據的發送和消費。

static void Main(string[] args)
{
     Send("IDG","Hello World!");
     Receive("IDG");
     Console.ReadLine();
}

值得一提的是:RabbitMQ 對持久化也提供了很是好的支持,有兩種模式的 queue 可供選擇:持久化和非持久化,若是採用持久化模式,消息是存放在硬盤中的,反之非持久化的模式,數據僅僅存放於內存中,一旦server重啓,非持久化模式的隊列數據將會丟失,最後補充一下,持久化能夠用於如下三個級別上: Queue,Exchange 和 Message。

更多高質量乾貨:參見個人 GitHub: dotnetfly
相關文章
相關標籤/搜索