Skip to content

RabbitMQ

L edited this page May 11, 2021 · 5 revisions

简介

RabbitMQ是轻量级的,并且易于在内部和云中部署。 它支持多种消息传递协议。 RabbitMQ可以部署在分布式和联合配置中,以满足高规模,高可用性要求
RabbitMQ支持在许多操作系统和云环境中运行,并为大多数流行语言提供各种开发人员工具
官网
基础概念
5015984-367dd717d89ae5db

基础知识

来自官方的基础知识
RabbitMQ是一个消息代理:它接受和转发消息
您可以将其视为邮局:当您将要发布的邮件放在邮箱中时,您可以确定RabbitMQ最终会将邮件发送给您的收件人
RabbitMQ和邮局之间的主要区别在于它不处理纸张,而是接受,存储和转发二进制blob数据 - 消息

术语

制作(Producing)只不过是发送。 发送消息的程序是生产者(producer):
1
队列(queue)是RabbitMQ中的邮箱的名称。 虽然消息流经RabbitMQ和您的应用程序,但它们只能存储在队列中。 队列只受主机的内存和磁盘限制的约束,它本质上是一个大的消息缓冲区。 许多生产者可以发送到一个队列的消息,并且许多消费者可以尝试从一个队列接收数据。 这就是我们代表队列的方式:
2
消费(Consuming)与接受有类似的意义。 消费者(consumer)是一个主要等待接收消息的程序:
3
请注意,生产者,消费者和代理不必驻留在同一主机上; 实际上在大多数应用中他们没有。
应用程序也可以是生产者和消费者。

安装部署Server

使用Docker安装RabbitMQ镜像(RabbitMQ Server)

docker run -d --name myrabbitmq -p 5673:5672 -p 15673:15672 docker.io/rabbitmq:3-management

如图所示的映射关系,端口15673为管理后台,5673为服务端口
6
访问http://localhost:15673
账号密码默认为guest/guest,登录
4
5

参考资料

docker rabbitmq镜像与相关设置
使用docker安装rabbitmq及遇到的问题

使用C#实现Client

包括一个生产者和一个消费者
生产者

public class Send
{
    public static IConnection connection { get; set; }
    public static IModel channel { get; set; }

    public static void Run(string ipaddress, int port, string userName, string password)
    {
        var factory = new ConnectionFactory() { HostName = ipaddress, Port = port, UserName = userName, Password = password };
        connection = factory.CreateConnection();
        channel = connection.CreateModel();
        channel.QueueDeclare(queue: "hello",
                                durable: false,
                                exclusive: false,
                                autoDelete: false,
                                arguments: null);


        Timer aTimer = new System.Timers.Timer(2000);
        int count = 1;
        // Hook up the Elapsed event for the timer. 
        aTimer.Elapsed += (sender, e) =>
        {
            string message = $"Hello World:{count}";
            var body = Encoding.UTF8.GetBytes(message);
            channel.BasicPublish(exchange: "",
                            routingKey: "hello",
                            basicProperties: null,
                            body: body);
            Console.WriteLine($"{DateTime.Now} [x] Sent {message}" );
            count++;
        };
        aTimer.AutoReset = true;
        aTimer.Enabled = true;

    }
}

消费者

public class Receive
{
    public static IConnection connection { get; set; }
    public static IModel channel { get; set; }
    public static void Run(string ipaddress, int port, string userName, string password)
    {
        var factory = new ConnectionFactory() { HostName = ipaddress, Port = port, UserName = userName, Password = password };
        connection = factory.CreateConnection();
        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($"{DateTime.Now} [x] Received {message}");
        };
        channel.BasicConsume(queue: "hello",
                                autoAck: true,
                                consumer: consumer);
    }
}

效果
20190606_154041
管理后台可以看到
队列中的消息数量、速度
7
连接客户端列表
8
渠道列表
9

示例代码

Send
Receive

Clone this wiki locally