RabbitMQ(一)初识

认识RabbitMQ

MQ是什么?

消息总线(Message Queue),是一种跨进程、异步的通信机制,用于上下游传递消息。由消息系统来确保消息的可靠传递。

MQ可用来做什么?

应用解耦、异步、流量削锋、数据分发、错峰流控、日志收集等。

MQ产品

RabbitMQKafkaActiveMQZeroMQRocketMQ等。
这里使用RabbitMQ。

RabbitMQ是什么?

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。

RabbitMQ能为你做些什么?

消息系统允许软件、应用相互连接和扩展.这些应用可以相互链接起来组成一个更大的应用,或者将用户设备和数据进行连接.消息系统通过将消息的发送和接收分离来实现应用程序的异步和解偶.

或许你正在考虑进行数据投递,非阻塞操作或推送通知。或许你想要实现发布/订阅,异步处理,或者工作队列。所有这些都可以通过消息系统实现。

RabbitMQ是一个消息代理 - 一个消息系统的媒介。它可以为你的应用提供一个通用的消息发送和接收平台,并且保证消息在传输过程中的安全。

技术亮点

  • 可靠性
    RabbitMQ提供了多种技术可以让你在性能和可靠性之间进行权衡。这些技术包括持久性机制、投递确认、发布者证实和高可用性机制。
  • 灵活的路由
    消息在到达队列前是通过交换机进行路由的。RabbitMQ为典型的路由逻辑提供了多种内置交换机类型。如果你有更复杂的路由需求,可以将这些交换机组合起来使用,你甚至可以实现自己的交换机类型,并且当做RabbitMQ的插件来使用。
  • 集群
    在相同局域网中的多个RabbitMQ服务器可以聚合在一起,作为一个独立的逻辑代理来使用。
  • 联合
    对于服务器来说,它比集群需要更多的松散和非可靠链接。为此RabbitMQ提供了联合模型。
  • 高可用的队列
    在同一个集群里,队列可以被镜像到多个机器中,以确保当其中某些硬件出现故障后,你的消息仍然安全。
  • 多协议
    RabbitMQ 支持多种消息协议的消息传递。
  • 广泛的客户端
    只要是你能想到的编程语言几乎都有与其相适配的RabbitMQ客户端。
  • 可视化管理工具
    RabbitMQ附带了一个易于使用的可视化管理工具,它可以帮助你监控消息代理的每一个环节。
  • 追踪
    如果你的消息系统有异常行为,RabbitMQ还提供了追踪的支持,让你能够发现问题所在。
  • 插件系统
    RabbitMQ附带了各种各样的插件来对自己进行扩展。你甚至也可以写自己的插件来使用。

安装

docker安装RabbitMQ

  • 查找镜像(有2种方式)
  • 登录rabbitmq官网找到docker镜像,选择想要的镜像的tag
  • 如果需要访问web管理页面,就选择tag为management的 这里使用的management
    docker pull rabbitmq:management
  • 运行(15672是管理界面的端口,5672是服务的端口。这里将管理系统的用户名和密码设置为admin 123456)
    docker run -dit --name Myrabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=123456 -p 15672:15672 -p 5672:5672 rabbitmq:managemen
    

Hello World

前置条件

本教程假设RabbitMQ已经安装在你本机的 (5672)端口。如果你使用了不同的主机、端口或者凭证,连接设置就需要作出一些对应的调整。

介绍

RabbitMQ 是一个消息代理:它用来接收消息,并将其进行转发。 你可以把它想象成一个邮局:当你把想要邮寄的邮件放到邮箱里后,邮递员就会把邮件最终送达到目的地。 在这个比喻中,RabbitMQ既代表了邮箱,也同时扮演着邮局和邮递员的角色.

RabbitMQ和邮局主要区别在于,RabbitMQ不处理纸质信件,取而代之,它接收、存储和转发的是被称为消息的二进制数据块。

下面介绍下通常情况下会用到的一些RabbitMQ和messaging术语:

  • 生产就是指的发送。一个用来发送消息的生产者程序:
  • 队列指的是存在于RabbitMQ当中的邮箱。虽然消息是在RabbbitMQ和你的应用程序之间流转,但他们是存储在队列中的。队列只收到主机内存和磁盘的限制,它实质上是存在于主机内存和硬盘中的消息缓冲区。多个生产者可以发送消息到同一个队列中,多个消费者也可以从同一个队列中接收消息。我们这样来描述一个队列:
  • 消费跟接收基本是一个意思。一个消费者基本上就是一个用来等待接收消息的程序:

Hello World

.net core 版本为.net core 3.1

当前Nuget引用RabbitMQ.Client版本为6.2.1

发送

创建一个生产者程序(使用控制台程序)

static void Main(string[] args)
{
    var factory = new ConnectionFactory() { HostName = "localhost",Port= 5672,UserName = "admin",Password = "123456" };
    //创建一个连接
    using (var connection = factory.CreateConnection())
    //创建通道
    using (var channel = connection.CreateModel())
    {
        //声明一个队列    
        channel.QueueDeclare(queue: "hello", durable: false, exclusive: false, autoDelete: false, arguments: null);

        string message = "Hello World!";
        var body = Encoding.UTF8.GetBytes(message);
        //发布消息
        channel.BasicPublish(exchange: "", routingKey: "hello", basicProperties: null, body: body);
        Console.WriteLine(" [x] Sent {0}", message);
    }

    Console.WriteLine(" Press [enter] to exit.");
    Console.ReadLine();
}

运行程序
然后打开http://localhost:15672 登录后选择tab Quesues
能看到当前有一个名称为hello的队列。

接收

消费者会监听来自与RabbitMQ的消息。所以不同于发布者只发送一条消息,我们会让消费者保持持续运行来监听消息,并将消息打印出来。

配置工作跟发布者是一样的;我们打开一个连接和一个信道,声明一个我们想要从其中获取消息的队列。注意这个队列需要与Send发布到信息的那个队列相匹配

static void Main(string[] args)
{
    var factory = new ConnectionFactory() { HostName = "localhost",Port= 5672,UserName = "admin",Password = "123456" };
    //创建一个连接
    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.ToArray());
        Console.WriteLine(" [x] Received {0}", message);
    };
    //noAck设置false,告诉broker,发送消息之后,消息暂时不要删除,等消费者处理完成再说
    channel.BasicConsume(queue: "hello",
                         autoAck: true,
                         consumer: consumer);

    Console.WriteLine(" Press [enter] to exit.");
    Console.ReadLine();
}

消费者会接收到发布者通过RabbitMQ发送的消息,并将其打印出来。消费者会一直保持运行状态来等待接受消息(可以使用Ctrl-C来将其停止),接下来我们可以试着在另一个终端里运行发布者代码来尝试发送消息了。

posted @ 2020-10-29 16:33  青杉  阅读(130)  评论(0)    收藏  举报