Hello RabbitMQ

什麼是RabbitMQ

RabbitMQ是訊息的中介層,可以想像是一個幫你保管、處理的佇列,只要發布者(Publisher)將訊息寫入後,該訊息會被放入指定的佇列,等待接收者(Consumer)的拿取。
特性大概有以下幾種:

  • 由Erlang開發
  • 符合進階訊息佇列協定(AMQP)
  • 支援非常多種語言與平台
  • 訊息接收、處理的可靠性
  • 高度靈活的路由功能
  • 高可用性(Availability)
  • 內建監控與管理介面
  • 可建立集群,提昇資料安全與服務不中斷
  • 提供各種插件(plugin)靈活運用

細節會在日後的文章陸續揭露或探討,而安裝方法非常簡單,網路上也有很多範例就不在這邊贅述了。
本文所使用的程式語言是 .NET Framework C#

Hello RabbitMQ

如果是.net core使用者須先建立專案,這邊以console模式當範例,依序建立兩個專案並進入專案加入RabbitMQ.Client package

1
2
3
4
5
6
7
dotnet new console -n Sender
cd Sender/
dotnet add package RabbitMQ.Client
cd ..
dotnet new console -n Receiver
cd Receiver/
dotnet add package RabbitMQ.Client

撰寫Publisher (範例命名為Sender)

  1. 建立連線的物件,hostname目前都是在本機所以localhost即,UserName與Password則需要另外建立。
    若是剛安裝好,預設是guest/guest為唯一且admin帳號。
1
2
var factory = new ConnectionFactory()
{ HostName = "localhost", UserName = "admin", Password = "pass123" };
  1. 建立連線作用域
1
2
3
4
5
6
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
}
}
  1. 宣告名稱為 hello 的佇列以存放訊息
1
2
3
4
5
6
channel.QueueDeclare(queue: "hello",
durable: false,
exclusive: false,
autoDelete: false,
arguments: null
);
  1. 建立訊息
1
2
var message = $"Hello RabbitMQ. {DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.fff")}";
var body = Encoding.UTF8.GetBytes(message);
  1. 發布訊息到 hello 訊息佇列
1
2
3
4
5
channel.BasicPublish(exchange: "",
routingKey: "hello",
basicProperties: null,
body: body
);

到這邊就完成發布者發布訊息的功能了。

撰寫接收者程式 (範例命名為Receiver)

  1. 步驟 1,2,3 與發布者相同,都是建立連線物件與宣告佇列名稱
  2. 建立委派接收到訊息的事件
1
2
3
4
5
6
7
8
9
10
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
Console.WriteLine("Received {0}", message);
};
channel.BasicConsume(queue: "hello",
autoAck: true,
consumer: consumer);

依序是將收到的內容先做UTF8編碼,接著印出訊息內容
最後的BasicConsume則是回覆給哪個訊息佇列、自動回覆、由那個接收者所回覆的。

Hello RabbitMQ 程式基本上就完成了。

程式範例檔

完整的範例檔放在這 範例,有興趣的可以自行下載。
裡面是一個方案,接收者與發佈者分別為兩個Console專案,編譯後可分別執行.exe檔案來查看結果,只要receiver沒有關閉,都能夠收到發布者的訊息。

  • 作者: MingYi Chou
  • 版權聲明: 轉載不用問,但請註明出處!本網誌均採用 BY-NC-SA 許可協議。