译文连接: https://www.infoworld.com/art...
RabbitMQ 是一个很是流行的,开源的,使用Erlang语言编写的框架,一般在电信级平台
中做为消息中间件使用,RabbitMQ实现了高级的AMQP协议用于实现进程间,应用程序间,服务器之间的消息交互,并且它还有一个很是🐂👃的特性,你可使用自定义插件来扩展RabbitMQ的功能,并且它还支持多协议,高性能,高可靠,集群以及高可用队列。html
建立队列的方式也多种多样,你能够编码建立,也能够经过管理员用户界面,甚至经过 PowerShell 进行队列建立。git
当你在用 RabbitMQ 时,你要理解下面两个术语github
生产者-消费者
是并行编程中很是流行的设计模式之一。安装 RabbitMQ 是很是简单的,在安装以前,你须要先安装 Erlang,根据你的操做系统选择正确版本呢的 Erlang,下载地址:https://www.erlang.org/downloads ,而后继续下载安装 RabbitMQ Server ,下载地址: https://www.rabbitmq.com/down...编程
如今 Erlang 和 RabbitMQ 已经成功安装到你的windows上,若是想和 Rabbitmq Server
进行交互,你须要安装一个 RabbitMQ .NET client
, 能够用 NuGet Package Manager
控制台去安装 RabbitMQ Client。windows
在 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。
更多高质量干货:参见个人 GitHub: dotnetfly