1. 如何在 C# 中使用 RabbitMQ

        共 3456字,需瀏覽 7分鐘

         ·

        2020-12-08 17:48

        譯文鏈接: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。

        瀏覽 21
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
          
          

            1. 久久嫩操 | 红桃精品 国产精品 | 美女啪啪啪免费网站 | 午夜久久久久 | 欧美日本美女网18 |