什麼是RabbitMQ
RabbitMQ是訊息的中介層,可以想像是一個幫你保管、處理的佇列,只要發布者(Publisher)將訊息寫入後,該訊息會被放入指定的佇列,等待接收者(Consumer)的拿取。
特性大概有以下幾種:
- 由Erlang開發
- 符合進階訊息佇列協定(AMQP)
- 支援非常多種語言與平台
- 訊息接收、處理的可靠性
- 高度靈活的路由功能
- 高可用性(Availability)
- 內建監控與管理介面
- 可建立集群,提昇資料安全與服務不中斷
- 提供各種插件(plugin)靈活運用
細節會在日後的文章陸續揭露或探討,而安裝方法非常簡單,網路上也有很多範例就不在這邊贅述了。
本文所使用的程式語言是 .NET Framework C#
Hello RabbitMQ
如果是.net core使用者須先建立專案,這邊以console模式當範例,依序建立兩個專案並進入專案加入RabbitMQ.Client package
1 | dotnet new console -n Sender |
撰寫Publisher (範例命名為Sender)
- 建立連線的物件,hostname目前都是在本機所以localhost即,UserName與Password則需要另外建立。
若是剛安裝好,預設是guest/guest為唯一且admin帳號。
1 | var factory = new ConnectionFactory() |
- 建立連線作用域
1 | using (var connection = factory.CreateConnection()) |
- 宣告名稱為 hello 的佇列以存放訊息
1 | channel.QueueDeclare(queue: "hello", |
- 建立訊息
1 | var message = $"Hello RabbitMQ. {DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.fff")}"; |
- 發布訊息到 hello 訊息佇列
1 | channel.BasicPublish(exchange: "", |
到這邊就完成發布者發布訊息的功能了。
撰寫接收者程式 (範例命名為Receiver)
- 步驟 1,2,3 與發布者相同,都是建立連線物件與宣告佇列名稱
- 建立委派接收到訊息的事件
1 | var consumer = new EventingBasicConsumer(channel); |
依序是將收到的內容先做UTF8編碼,接著印出訊息內容
最後的BasicConsume則是回覆給哪個訊息佇列、自動回覆、由那個接收者所回覆的。
Hello RabbitMQ 程式基本上就完成了。
程式範例檔
完整的範例檔放在這 範例,有興趣的可以自行下載。
裡面是一個方案,接收者與發佈者分別為兩個Console專案,編譯後可分別執行.exe檔案來查看結果,只要receiver沒有關閉,都能夠收到發布者的訊息。