• RabbitMQ的学习


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

    项目说明

    > 1. 这是一个ASP.NET Core Web项目,主要展示RabbitMQ的使用
    > 2. ReceiveMQ接收消息项目
    > 3. SendMQ发送消息项目
    > 4. 如果发送的信息很多的时候,可以启动多个消费者(ReceiveMQ)

    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/RabbitMQDemo

    其他RabbitMQ的文章

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

  • 相关阅读:
    canvas,制作炫酷的时钟和倒计时
    【bzoj2142】【礼物】拓展Lucas定理+孙子定理
    【hdu3652】数位dp(浅尝ACM-A)
    【bzoj4152】【The Captain】最短路(堆优化)(浅尝ACM-B)
    【bzoj2190】【仪仗队】欧拉函数+线性筛(浅尝ACM-J)
    【bzoj1087】【互不侵犯King】状压dp裸题(浅尝ACM-D)
    【bzoj1566】【管道取珠】竟然是dp题(浅尝ACM-E)
    【bzoj2957】【楼房重建】另类的线段树(浅尝ACM-H)
    【codevs1907】【方格取数3】二分图最大带权独立集
    二分图变种之最小路径覆盖、最小点覆盖集【poj3041】【poj2060】
  • 原文地址:https://www.cnblogs.com/zhao123/p/10607072.html
Copyright © 2020-2023  润新知