如何在 C# 中使用 RabbitMQ
譯文鏈接:https://www.infoworld.com/article/3200210/how-to-work-with-rabbitmq-in-c.html
RabbitMQ 是一個非常流行的,開源的,使用Erlang語言編寫的框架,通常在電信級平臺中作為消息中間件使用,RabbitMQ實現(xiàn)了高級的AMQP協(xié)議用于實現(xiàn)進程間,應用程序間,服務器之間的消息交互,而且它還有一個非常??的特性,你可以使用自定義插件來擴展RabbitMQ的功能,而且它還支持多協(xié)議,高性能,高可靠,集群以及高可用隊列。
創(chuàng)建隊列的方式也多種多樣,你可以編碼創(chuàng)建,也可以通過管理員用戶界面,甚至通過 PowerShell 進行隊列創(chuàng)建。
RabbitMQ 術語
當你在用 RabbitMQ 時,你要理解下面兩個術語
隊列是一個數(shù)據(jù)結(jié)構(gòu)上的概念,支持 FIFO 特性,在本文中,消息隊列就是一個可以存放消息的巨大緩存。
producer(生產(chǎn)者) 的使命是生成數(shù)據(jù)并推送到隊列的一種角色組件,consumer(消費者)它能夠從存儲消息的隊列中提取數(shù)據(jù)進行消費,
生產(chǎn)者-消費者是并行編程中非常流行的設計模式之一。
安裝和啟動
安裝 RabbitMQ 是非常簡單的,在安裝之前,你需要先安裝 Erlang,根據(jù)你的操作系統(tǒng)選擇正確版本呢的 Erlang,下載地址:https://www.erlang.org/downloads ?,然后繼續(xù)下載安裝 RabbitMQ Server ,下載地址:https://www.rabbitmq.com/download.html
用 C# 構(gòu)建 RabbitMQ
現(xiàn)在 Erlang 和 RabbitMQ 已經(jīng)成功安裝到你的windows上,如果想和 Rabbitmq Server 進行交互,你需要安裝一個 RabbitMQ .NET client , 可以用 NuGet Package Manager 控制臺去安裝 RabbitMQ Client。
在 Visual Studio 中新建一個 Console Application,然后通過 NuGet Package Manager 安裝 RabbitMQ.Client 開發(fā)包,假定 RabbitMQ Server 是運行在本機,下面的代碼片段創(chuàng)建了一個和 RabbitMQ Server 交互的 Connection 連接,代碼如下:
ConnectionFactory?connectionFactory?=?new?ConnectionFactory();
IConnection?connection?=?connectionFactory.CreateConnection();
現(xiàn)在再次假定 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();
????????}
發(fā)送和接收消息
現(xiàn)在 RabbitMQ Service 已經(jīng)在本地正常運行,使用下面的方法向隊列發(fā)送消息,請注意通往 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 進行通訊從而發(fā)送和接收消息,不過上面這種隊列是不持久的,為啥這么說呢?因為我在 QueueDeclare 方法的第二個參數(shù)中設置了 false,所以送往這個 queue 的 message 只會存留于內(nèi)存中,一旦 server 重啟,這個數(shù)據(jù)將會丟失。
下面的代碼展示了如何從 queue 中消費數(shù)據(jù)。
????????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 方法進行數(shù)據(jù)的發(fā)送和消費。
static?void?Main(string[]?args)
{
?????Send("IDG","Hello?World!");
?????Receive("IDG");
?????Console.ReadLine();
}
值得一提的是:RabbitMQ 對持久化也提供了非常好的支持,有兩種模式的 queue 可供選擇:持久化和非持久化,如果采用持久化模式,消息是存放在硬盤中的,反之非持久化的模式,數(shù)據(jù)僅僅存放于內(nèi)存中,一旦server重啟,非持久化模式的隊列數(shù)據(jù)將會丟失,最后補充一下,持久化可以用于以下三個級別上:Queue,Exchange 和 Message。
