如何在 C# 中使用 RabbitMQ

译文链接:https://www.infoworld.com/article/3200210/how-to-work-with-rabbitmq-in-c.html

RabbitMQ 是一个非常流行的,开源的,使用Erlang语言编写的框架,通常在电信级平台中作为消息中间件使用,RabbitMQ实现了高级的AMQP协议用于实现进程间,应用程序间,服务器之间的消息交互,而且它还有一个非常🐂👃的特性,你可以使用自定义插件来扩展RabbitMQ的功能,而且它还支持多协议,高性能,高可靠,集群以及高可用队列。

创建队列的方式也多种多样,你可以编码创建,也可以通过管理员用户界面,甚至通过 PowerShell 进行队列创建。

RabbitMQ 术语

当你在用 RabbitMQ 时,你要理解下面两个术语

  • 队列是一个数据结构上的概念,支持 FIFO 特性,在本文中,消息队列就是一个可以存放消息的巨大缓存。
  • producer(生产者) 的使命是生成数据并推送到队列的一种角色组件,consumer(消费者)它能够从存储消息的队列中提取数据进行消费,生产者-消费者 是并行编程中非常流行的设计模式之一。

安装和启动

安装 RabbitMQ 是非常简单的,在安装之前,你需要先安装 Erlang,根据你的操作系统选择正确版本呢的 Erlang,下载地址:https://www.erlang.org/downloads  ,然后继续下载安装 RabbitMQ Server ,下载地址:https://www.rabbitmq.com/download.html

用 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。

原文出处:微信公众号【 码农读书 码农读书】

原文链接:https://mp.weixin.qq.com/s/irp9BAv1ZHmHRBWZTaDcHA

本文观点不代表Dotnet9立场,转载请联系原作者。

发表评论

登录后才能评论