vlambda博客
学习文章列表

如何在c#中使用RabbitMQ


RabbitMQ是一种越来越流行的开源、快速消息代理,它使用Erlang编写并构建在开放电信平台框架上。它实现了高级消息队列协议(AMQP),用于在进程、应用程序和服务器之间交换数据。它特别吸引人,因为它可以通过插件支持进行扩展,支持许多协议,并提供高性能、可靠性、集群和高可用队列。

你可以通过编写代码、通过管理用户界面或通过PowerShell在RabbitMQ中创建队列。

当使用RabbitMQ时,你应该注意两个术语:

队列是一种基于先进先出(FIFO)的数据结构。在此上下文中,队列是可以保存数据的大型消息缓冲区。

生产者是产生数据的组件;它向队列发送数据,消费者是使用存储在队列中的数据的组件。(生产者-消费者模式是并行编程中使用最广泛的模式之一。)

安装和设置

设置RabbitMQ非常简单。在安装RabbitMQ之前,应该先安装Erlang。根据使用的操作系统下载正确的Erlang版本。接下来,下载并安装RabbitMQ服务器。

在c#中使用RabbitMQ

现在你已经在你的系统中安装了Erlang和RabbitMQ,你需要安装RabbitMQ . net客户端,依靠来连接和使用RabbitMQ服务。你可以通过NuGet包管理器安装RabbitMQ客户端。

在Visual Studio中创建一个新的控制台应用程序。接下来,通过NuGet包管理器安装RabbitMQ.Client包。假设RabbitMQ服务器在你的系统中本地运行,下面的代码片段可以用来创建到RabbitMQ服务器的连接。

ConnectionFactory connectionFactory = new ConnectionFactory();IConnection connection = connectionFactory.CreateConnection();

现在假设RabbitMQ服务在一个远程系统中运行。下面是一个返回RabbitMQ服务连接实例的方法。

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服务在你的系统本地运行时,使用以下方法将消息发送到队列。注意,到RabbitMQ服务的连接是使用默认设置建立的。

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)); } }}

通道用于与服务器建立通信以发送和接收消息。使用此方法发送到队列的消息不是持久的—我将false作为第二个参数传递给QueueDeclare方法。因此,使用此方法发送的消息仅保存在内存中,不会在服务器重启后继续存在。

下面的方法说明了如何使用先前存储在队列中的数据。

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); } } }}

下一个代码片段展示了如何调用我们在这篇文章中创建的发送和接收方法:

static void Main(string[] args){ Send("IDG", "Hello World!"); Receive("IDG"); Console.ReadLine();}

RabbitMQ的持久化

RabbitMQ为持久化提供了出色的支持。你可以有两种类型的队列:持久化队列和非持久化队列。持久化队列将消息保存在磁盘上,而非持久化队列仅保存在内存中。因此,在服务器重启后,持久化队列中的消息是可用的,而非持久化队列中的消息则会丢失。

你可以在三个级别上设置持久化:队列、交换和消息。