RabbitMQ的学习

生成者就是发送信息,消费者就是接收信息,队列就是存储数据的排队。消息经过你的应用程序和RabbitMQ进行传输,它们只能存储在队列中,队列容量没有限制,你要存储多少消息均可以——基本上是一个无限的缓冲区。多个生产者(producers)可以把消息发送给同一个队列,一样,多个消费者(consumers)也能从同一个队列(queue)中获取数据。
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通讯方法。应用程序经过读写出入队列的消息(针对应用程序的数据)来通讯,而无需专用链接来连接它们。
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。全部主要的编程语言均有与代理接口通信的客户端库。消息传递相较文件传递与远程过程调用(RPC)而言,彷佛更胜一筹,由于它具备更好的平台无关性,并可以很好地支持并发与异步调用。对操做的实时性要求不高,而须要执行的任务极为耗时,存在异构系统间的整合等效果更好。使用工做队列的一个好处就是它可以并行的处理队列。若是堆积了不少任务,咱们只须要添加更多的消费者(Consuming)就能够了,扩展很简单。html

项目说明

> 1. 这是一个ASP.NET Core Web项目,主要展现RabbitMQ的使用
> 2. ReceiveMQ接收消息项目
> 3. SendMQ发送消息项目
> 4. 若是发送的信息不少的时候,能够启动多个消费者(ReceiveMQ)git

ReceiveMQ消费者项目

using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Text;
using System.Threading;

/// <summary>
/// 接收信息
/// </summary>
namespace ReceiveMQ
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("销售者开始运行");

            var factory = new ConnectionFactory() { HostName = "localhost", Port = 32850, UserName = "test", Password = "test123" };
            using (var connection = factory.CreateConnection())
            using (var channel = connection.CreateModel())
            {
                channel.QueueDeclare(queue: "hello",
                                     durable: false,
                                     exclusive: false,
                                     autoDelete: false,
                                     arguments: null);

                //模拟接受者
                var consumer = new EventingBasicConsumer(channel);
                consumer.Received += (model, ea) =>
                {
                    var body = ea.Body;
                    var message = Encoding.UTF8.GetString(body);
                    Console.WriteLine("接收信息:{0}", message);
                };

                while (true) {

                    channel.BasicConsume(queue: "hello",
                                         autoAck: true,
                                         consumer: consumer);

                    Thread.Sleep(TimeSpan.FromSeconds(10));
                    Console.WriteLine("每隔10秒接收一次");
                }
            }

        }
    }
}

SendMQ生产者项目

using RabbitMQ.Client;
using System;
using System.Text;
using System.Threading;

/// <summary>
/// 发送信息
/// </summary>
namespace SendMQ
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("生产者开始运行");

            var factory = new ConnectionFactory() { HostName = "localhost", Port = 32850, UserName = "test", Password = "test123" };
            using (var connection = factory.CreateConnection())
            using (var channel = connection.CreateModel())
            {
                channel.QueueDeclare(queue: "hello",
                                     durable: false,
                                     exclusive: false,
                                     autoDelete: false,
                                     arguments: null);

                //模拟生成者
                Random rd = new Random();
                while (true)
                {
                    string message = $"你好,{rd.Next(10)}。";
                    var body = Encoding.UTF8.GetBytes(message);

                    channel.BasicPublish(exchange: "",
                                            routingKey: "hello",
                                            basicProperties: null,
                                            body: body);

                    Console.WriteLine("发送信息:{0}", message);

                    //随机休眠
                    Thread.Sleep(TimeSpan.FromSeconds(rd.Next(5)));
                }
            }

        }
    }
}

运行效果图

docker安装RabbitMQ 

设置用户名和密码而且启用管理页面
docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password rabbitmq:3-management

 项目源码

https://github.com/jasonhua95/samll-project/tree/master/RabbitMQDemogithub

其余RabbitMQ的文章

利用开源库实现RabbitMQ,EasyNetQ操做RabbitMQ(高级消息队列),另外一种简单的方式操做消息队列。docker

相关文章
相关标签/搜索