RabbitMQ 是一個非常流行的,開源的,使用Erlang語言編寫的框架,通常在電信級平臺
中作為訊息中介軟體使用,RabbitMQ實現了高階的AMQP協議用於實現程序間,應用程式間,伺服器之間的訊息互動,而且它還有一個非常的特性,你可以使用自定義外掛來擴充套件RabbitMQ的功能,而且它還支援多協議,高效能,高可靠,叢集以及高可用佇列。
建立佇列的方式也多種多樣,你可以編碼建立,也可以透過管理員使用者介面,甚至透過 PowerShell 進行佇列建立。
RabbitMQ 術語當你在用 RabbitMQ 時,你要理解下面兩個術語
用 C# 構建 RabbitMQ現在 Erlang 和 RabbitMQ 已經成功安裝到你的windows上,如果想和 Rabbitmq Server
進行互動,你需要安裝一個 RabbitMQ .NET client
, 可以用 NuGet Package Manager
控制檯去安裝 RabbitMQ Client。
在 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。