理论
什么是消息队列
”消息“指的是两个应用间传递的数据。数据的类型有很多种形式,可能只包含文本字符串,也可能包含嵌入对象。
“消息队列(Message Queue)”是在消息的传输过程中保存消息的容器。在消息队列中,通常有生产者和消费者两个角色。生产者只负责发送数据到消息队列,谁从消息队列中取出数据处理,他不管。消费者只负责从消息队列中取出数据处理,他不管这是谁发送的数据。
为什么使用消息队列
主要有三个作用:
- 解耦
- 异步
- 削峰
解耦
如图所示。假设有系统B、C、D都需要系统A的数据,于是系统A调用三个方法发送数据到B、C、D。这时,系统D不需要了,那就需要在系统A把相关的代码删掉。假设这时有个新的系统E需要数据,这时系统A又要增加调用系统E的代码。为了降低这种强耦合,就可以使用MQ,系统A只需要把数据发送到MQ,其他系统如果需要数据,则从MQ中获取即可。
异步
如图所示。一个客户端请求发送进来,系统A会调用系统B、C、D三个系统,同步请求的话,响应时间就是系统A、B、C、D的总和,也就是800ms。如果使用MQ,系统A发送数据到MQ,然后就可以返回响应给客户端,不需要再等待系统B、C、D的响应,可以大大地提高性能。对于一些非必要的业务,比如发送短信,发送邮件等等,就可以采用MQ。
削峰
如图所示。这其实是MQ一个很重要的应用。假设系统A在某一段时间请求数暴增,有5000个请求发送过来,系统A这时就会发送5000条SQL进入MySQL进行执行,MySQL对于如此庞大的请求当然处理不过来,MySQL就会崩溃,导致系统瘫痪。如果使用MQ,系统A不再是直接发送SQL到数据库,而是把数据发送到MQ,MQ短时间积压数据是可以接受的,然后由消费者每次拉取2000条进行处理,防止在请求峰值时期大量的请求直接发送到MySQL导致系统崩溃。
RabbitMQ的特点
RabbitMQ 是一款使用 Erlang
语言开发的,实现 AMQP(高级消息队列协议) 的开源消息中间件。首先要知道一些 RabbitMQ 的特点,官网可查:
- 可靠性。支持持久化,传输确认,发布确认等保证了 MQ 的可靠性。
- 灵活的分发消息策略。这应该是 RabbitMQ 的一大特点。在消息进入 MQ 前由 Exchange(交换机) 进行路由消息。分发消息策略有:简单模式、工作队列模式、发布订阅模式、路由模式、通配符模式。
- 支持集群。多台 RabbitMQ 服务器可以组成一个集群,形成一个逻辑 Broker 。
- 多种协议。RabbitMQ 支持多种消息队列协议,比如 STOMP、MQTT 等等。
- 支持多种语言客户端。RabbitMQ 几乎支持所有常用编程语言,包括 Java、.NET、Ruby 等等。
- 可视化管理界面。RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker 。
- 插件机制。RabbitMQ 提供了许多插件,可以通过插件进行扩展,也可以编写自己的插件。
实践
安装RabbitMQ
安装erLang语言,配置环境变量
RabbitMQ 基于 erLang 语言实现,因此需要先安装 erLang 语言环境。
首先到 erLang 官网下载 Windows 安装包。下载下来的安装包一直点击下一步安装即可。
接下来配置环境变量:
Windows 中有两种环境变量:用户变量和系统变量。其中用户变量只对当前用户有效,系统变量对所有用户有效。
验证环境变量是否配置成功:
erl -version
安装RabbitMQ服务端
- 下载 Windows 版本对应的服务端安装包,然后一直点击下一步进行安装。
- 接着进入安装目录的 sbin 文件夹并打开 cmd ,输入
rabbitmq-plugins enable rabbitmq_management
命令安装管理页面的插件:
-
然后双击
rabbitmq-server.bat
启动服务。 -
这时,打开浏览器输入
http://localhost:15672
,账号密码默认是:guest/guest
。
- 至此,我们已经成功启动 RabbitMQ 服务。
启动失败
如果双击 rabbitmq-server.bat
启动服务时,DOS 窗口一闪而过,那么有可能是在安装 RabbitMQ.exe 结束的时候,默认启动了服务。
对一闪而过的 DOS 窗口,如果我们手速快点可以截到如下截图:
这个截图明确说明是由于另外的 RabbitMQ 服务占用了 25672 端口导致服务启动失败。此时我们只需要在任务管理器中找到此服务停止即可:
总结
本文我们简单介绍了 RabbitMQ 的理论部分以及 RabbitMQ 服务的启动,接下来我们将使用 SpringBoot 完成对 RabbitMQ 的整合。