Ø  简介

C# 实现消息队列的方式有很多种,比如:MSMQ、RabbitMQ、EQueue 等,本文主要介绍使用 RabbitMQ 实现消息队列的基础入门。包括如下内容:

1.   什么是消息队列?

2.   什么是 RabbitMQ?

3.   安装 RabbitMQ Server

4.   RabbitMQ 的基本运用

5.   远程部署 RabbitMQ 服务

6.   RabbitMQ 常用命令

1.   什么是消息队列?

消息队列 MQ(全称为 Message Queue),可实现两个应用程序之间进行通信,MQ 是生产者与消费者模型的典型代表,一端往消息队列中写入消息,另一端可以读取或者订阅队列中的消息。MQ 遵循的是 AMQP 协议(高级消息队列协议:使得遵从该规范的客户端应用和消息中间件服务器的全功能互操作成为可能)的具体实现和产品。

MQ 是一种消息中间件技术,所以它能够支持多种类型的语言开发,同时也是跨平台的通信机制,也就是说 MQ 支持将信息转化为 XML 或者 Json 等类型的数据存储到消息队列中,然后可以使用不同的语言来处理消息队列中的消息,这样就很容易的做到了信息的通信,同时也为信息的通信起到了缓冲的作用,经常会在金融项目中使用这种通信机制。

MQ 的主要作用用于提高系统的并发性,将一些不需要及时响应客户端且占用较多资源的操作放入队列,再由另外一个线程去异步处理这些队列,可极大的提高系统的并发能力。

消息传递相比较文件传递与远程调用(RPC)而言,视乎更胜一筹,因为跟平台无关,并能够很好的支持并发与异步调用,所以通常用于以下情况:

1.   对操作的实时性要求不高;

2.   缓冲(消息/数据);

3.   需要执行的任务比较耗时;

4.   存在异构系统间的整合;

2.   什么是 RabbitMQ?

RabbitMQ 是一个在 AMQP 基础上完整的,可复用的企业消息系统,它遵循 Mozilla Public License 开源协议。

RabbitMQ 是部署最广泛的开源消息代理。RabbitMQ 拥有成千上万的用户,是最受欢迎的开源消息代理之一。RabbitMQ 在全球范围内的小型初创企业和大型企业中都得到使用。

RabbitMQ 轻巧,易于在内部和云中部署。它支持多种消息传递协议。RabbitMQ 可以部署在分布式和联合配置中,以满足大规模,高可用性的要求。RabbitMQ 官方网址:https://www.rabbitmq.com/

1)   RabbitMQ 的特点

支持多种消息传递协议;

分布式部署;

支持多平台部署,例如:Windows Server、Linux 等;

支持多语言运用,例如:C#、Java、PHP、Python 等;

3.   安装 RabbitMQ Server

1)   进入官网下载地址

https://www.rabbitmq.com/#getstarted

2)   点击 Download + Installation

3)   点击官网推荐的 Windows 系统的安装包

4)   Windows 上安装 RabbitMQ,推荐了两个安装选项:

1.   使用 Chocolatey 安装;

Chocolatey 类似于 Nuget 软件包管理工具,这里不使用该方式安装。

2.   使用官方安装程序;

这里使用该方式进行安装,点击【Using the official installer】。

5)   这里说了,在 Windows 上运行 RabbitMQ 依赖于 Erlang 框架,所以先下载并安装它:

说明:RabbitMQ 服务是用 Erlang 语言编写的,Erlang 类似于 C# 调用的 .NET Framework 框架。

1.   点击 OTP 22.1 Windows 64-bit Binary File (264) 进行下载

2.   下载完成后进行安装(注意:需要以管理员身份安装

默认安装在 C:\Program Files\erl10.5 目录下

3.   安装完成后,设置环境变量

系统变量 -> Path -> 编辑 -> 新建,输入:C:\Program Files\erl10.5\bin,保存即可。

4.   检查是否安装成功,运行 CMD

6)   依然是刚才的页面,下载 RabbitMQ Server

7)   下载后直接安装

默认安装在 C:\Program Files\RabbitMQ Server 目录下

8)   检查是否安装成功,运行 CMD

CD 到 RabbitMQ 的 sbin 目录下,输入:CD C:\Program Files\RabbitMQ Server\rabbitmq_server-3.8.1\sbin

检查安装状态,输入:rabbitmqctl status

启用 RabbitMQ 管理工具,输入:rabbitmq-plugins enable rabbitmq_management

进入管理页面,浏览器地址栏输入:http://127.0.0.1:15672/

另外,在 Windows 服务列表中也可以找到 RabbitMQ Server

4.   RabbitMQ 的基本运用

1)   首先创建两个控制台应用程序

RabbitMQProducer(生产者),用于向消息队列中发送消息

RabbitMQConsumer(消费者),用于接收消息队列中的消息。

2)   添加 RabbitMQ.Client 客户端程序集

提示:对于 .NET Framework 4.0 的目标项目,RabbitMQ.Client 最高支持的版本是 RabbitMQ.Client.3.5.7。

3)   向消息队列中发送消息

1.   C# 代码

using RabbitMQ.Client;

var factory = new ConnectionFactory();      //连接 RabbitMQ 工厂实例

factory.HostName = "localhost";             //要连接到的主机,默认为 localhost

factory.Port = 5672;                        //连接断开,默认为 -1(5672)

factory.UserName = "guest";                 //RabbitMQ 连接用户名,默认为 guest

factory.Password = "guest";                 //RabbitMQ 连接密码,默认为 guest

//创建连接对象

using (var connection = factory.CreateConnection())

{

//创建一个新的通道、会话和模型

using (var channel = connection.CreateModel())

{

/*

* 创建一个名为 myQueue1 的消息队列,如果名称相同不会重复创建,参数解释:

* 参1:myQueue1, 消息队列名称;

* 参2:false, 是否持久化,持久化的队列会存盘,服务器重启后任然存在;

* 参3:false, 是否为排他队列,排他队列表示仅对首次声明它的连接可见,并在连接断开时自动删除。这种队列适用于一个客户端同时发送和读取消息的应用场景。

* 参4:false, 是否自动删除,自动删除的前提是:至少有一个消费者连接到这个队列,之后所有与这个队列连接的消费者都断开时,才会自动删除。

* 参5:设置队列的其他一些参数,如 x-rnessage-ttl、x-expires、x-rnax-length、x-rnax-length-bytes、x-dead-letter-exchange、x-deadletter-routing-key、x-rnax-priority 等。

*/

channel.QueueDeclare("myQueue1", false, false, false, null);

var properties = channel.CreateBasicProperties();

properties.DeliveryMode = 1;

string message = "Hello RabbitMQ";  //消息内容

byte[] body = Encoding.UTF8.GetBytes(message);

channel.BasicPublish("", "myQueue1", properties, body);    //发送(生产)消息

Console.WriteLine($"Send Message: {message}");

}

}

Console.ReadLine();

2.   运行以上代码,使用 rabbitmqctl list_queues 命令查看结果:

3.   也可以使用管理工具查看

4)   接收消息队列中的消息

var factory = new ConnectionFactory();      //连接 RabbitMQ 工厂实例

factory.HostName = "localhost";             //要连接到的主机,默认为 localhost

factory.Port = 5672;                        //连接断开,默认为 -1(5672)

factory.UserName = "guest";                 //RabbitMQ 连接用户名,默认为 guest

factory.Password = "guest";                 //RabbitMQ 连接密码,默认为 guest

//不能放入 using 语句中,否则当 using 语句结束后会 Close 连接,EventingBasicConsumer.Received 事件将不会被触发

var connection = factory.CreateConnection();

var channel = connection.CreateModel();

channel.QueueDeclare("myQueue1", false, false, false, null);

var consumer = new EventingBasicConsumer(channel);  //消费者(指定消息通道)

channel.BasicConsume("myQueue1", true, consumer);   //消费消息(在当前通道中监听 myQueue1 队列,并进行消费)

//该事件在接收到消息时触发

consumer.Received += (sender, e) =>

{

byte[] body = e.Body;   //消息字节数组

string message = Encoding.UTF8.GetString(body); //消息内容

Console.WriteLine($"Received: {message}, {DateTime.Now.ToString("HH: mm:ss fff")}");

};

Console.ReadLine();

connection.Close();

channel.Close();

5)   模拟频繁发送/接收消息

1.   修改代码

for (int i = 0; i < 100; i++)

{

string message = $"Hello RabbitMQ {i}";

byte[] body = Encoding.UTF8.GetBytes(message);

channel.BasicPublish("", "myQueue1", properties, body);

Console.WriteLine($"Send: {message}, {DateTime.Now.ToString("HH:mm:ss fff")}");

System.Threading.Thread.Sleep(1000);    //间隔1秒钟发送一次

}

2.   运行效果

5.   远程部署 RabbitMQ 服务

我们之前是将 RabbitMQ 服务部署在本机,以 localhost 的主机名去访问。在实际工作通常是将 RabbitMQ 服务部署在远程的服务器上,提供给更多的客户端去访问。下面是具体的操作步骤:

1)   具体的安装步骤与本地安装一致(可以参考本地安装)

2)   开放 5672 端口(这是 RabbitMQ 服务的默认端口)

1.   打开防火墙,开放 5672 端口的访问;

2.   如果是阿里云 ECS 服务器,还需要在安全组规则开放对 5672 端口访问。

3)   RabbitMQ 默认不支持 guest 用户远程访问

4)   解决办法很简单,添加一个新用户即可

1.   打开 RabbitMQ 管理工具,进入用户管理 Tab

2.   添加用户后,默认是没有权限的,点击用户名进行权限设置

3.   点击 Set permission 即可

4.   另外,也可以使用命令进行权限设置

rabbitmqctl set_permissions -p "/" abeam "." "." ".*"

6.   RabbitMQ 常用命令

首先,进入 RabbitMQ 命令

CMD: CD C:\Program Files\RabbitMQ Server\rabbitmq_server-3.8.1\sbin

创建 abeam 用户并指定密码

rabbitmqctl add_user abeam abeamli

设置 abeam 用户读写所有队列的权限

rabbitmqctl set_permissions abeam ".*"  ".*"  ".*"

设置 abeam 用户所属的用户组

rabbitmqctl set_user_tags abeam administrator

查看用户列表

rabbitmqctl list_users

修改 abeam 用户的密码为 abeam123

rabbitmqctl change_password abeam abeam123

删除 abeam 用户

rabbitmqctl delete_user abeam

C# 消息队列之 RabbitMQ 基础入门的更多相关文章

  1. C# 消息队列之 RabbitMQ 进阶篇

    Ø  简介 在之前的 C# 消息队列之 RabbitMQ 基础入门 中介绍了 RabbitMQ 的基本用法,其实要更全面的掌握 RabbitMQ 这个消息队列服务,我们还需要掌握以下内容: 1.   ...

  2. ASP.NET Core消息队列RabbitMQ基础入门实战演练

    一.课程介绍 人生苦短,我用.NET Core!消息队列RabbitMQ大家相比都不陌生,本次分享课程阿笨将给大家分享一下在一般项目中99%都会用到的消息队列MQ的一个实战业务运用场景.本次分享课程不 ...

  3. RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ基础知识详解,RabbitMQ布曙

    消息队列及常见消息队列介绍 2017-10-10 09:35操作系统/客户端/人脸识别 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以 ...

  4. 快速入门分布式消息队列之 RabbitMQ(3)

    目录 目录 前文列表 前言 通道 Channel 一个基本的生产者消费者实现 消费者 生产者 运行结果 应用预取计数 应用 ACK 机制 最后 前文列表 快速入门分布式消息队列之 RabbitMQ(1 ...

  5. 快速入门分布式消息队列之 RabbitMQ(2)

    目录 目录 前文列表 RabbitMQ 的特性 Message Acknowledgment 消息应答 Prefetch Count 预取数 RPC 远程过程调用 vhost 虚拟主机 插件系统 最后 ...

  6. 快速入门分布式消息队列之 RabbitMQ(1)

    目录 目录 前言 简介 安装 RabbitMQ 基本对象概念 Message 消息 Producer 生产者 Consumer 消费者 Queue 队列 Exchange 交换机 Binding 绑定 ...

  7. Spring Boot 揭秘与实战(六) 消息队列篇 - RabbitMQ

    文章目录 1. 什么是 RabitMQ 2. Spring Boot 整合 RabbitMQ 3. 实战演练4. 源代码 3.1. 一个简单的实战开始 3.1.1. Configuration 3.1 ...

  8. 消息队列系统 -- RabbitMQ

    消息队列系统 -- RabbitMQ RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Que ...

  9. 消息队列之 RabbitMQ

    https://www.jianshu.com/p/79ca08116d57 关于消息队列,从前年开始断断续续看了些资料,想写很久了,但一直没腾出空,近来分别碰到几个朋友聊这块的技术选型,是时候把这块 ...

随机推荐

  1. ASP.NET Core 如何用 Cookie 来做身份验证

    前言 本示例完全是基于 ASP.NET Core 3.0.本文核心是要理解 Claim, ClaimsIdentity, ClaimsPrincipal,读者如果有疑问,可以参考文章 理解ASP.NE ...

  2. php使用inotify扩展监控文件或目录的变化

    一.安装inotify扩展 1.下载inotify扩展源码 https://pecl.php.net/package/inotify 对于php7以上版本,请下载 inotify-2.0.0.tgz. ...

  3. 【CF1172E】Nauuo and ODT(Link-Cut Tree)

    [CF1172E]Nauuo and ODT(Link-Cut Tree) 题面 CF 给你一棵树,每个节点有一个颜色. 定义一条路径的权值为路径上不同颜色的数量.求所有有向路径的权值和. 有\(m\ ...

  4. 二级目录下的运行main.py,找不到上级目录的解决方法

    import os, sys sys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))

  5. GO 函数的参数

    一.函数 函数的参数 1.1 参数的使用 形式参数:定义函数时,用于接收外部传入的数据,叫做形式参数,简称形参. 实际参数:调用函数时,传给形参的实际的数据,叫做实际参数,简称实参. 函数调用: ​ ...

  6. java主函数

    相信很多初次接触java的同学,在遇见主函数的时候,听到最多的就是主函数的格式是固定的,不能进行修改等等.这就让人疑惑了,主函数为啥就那么特殊呢?接下来博主会为大家解释主函数.大家先看看下面这个程序: ...

  7. Java 内建函数式接口

    Java 提供一个包:java.util.function :包中主要提供四个核心接口: 1.功能性接口(Function) public interface Function<T,R> ...

  8. 六个office免费学习的精品教程 office自学教程让你从小白到高手

    今天给大家分享六个免费学习的精品教程,包括了word,ppt,excel常用的办公三剑客,学会这三个让你办公无忧,也能让你靠这些技术找到一份好工作,这些office自学教程让你从小白到高手. 一.PP ...

  9. Vue实战狗尾草博客管理平台第六章

    Vue实现狗尾草博客后台管理系统第六章 本章节内容 文章列表 文章详情 草稿箱 文章发布. 本章节内容呢,开发的很是随意哈,因为多数就是element-ui的使用,熟悉的童鞋,是可以很快完成本章节的内 ...

  10. tcp滑动窗口和读写缓冲区

    最近突然忘记了 滑动窗口的原理,在网上找到了比较好的视频,现在在这里同大家分享: 注:反正进程间切换 视频链接: https://www.youtube.com/watch?v=R6ArbkVj-N8 ...