消息队列
RabbitMQ是一款使用Erlang语言开发的,实现AMQP(高级消息队列协议)的开源消息中间件。消息队列顾名思义,就是保存消息的一个队列。消息是指两个应用间传递的数据,队列是一种先进先出的数据结构。通常有生产者、消费者这两个角色。生产者只负责发送消息给消息队列,消费者只负责从消息队列中取出数据进行消费。
特点:
- 可靠性。支持持久化,传输确认,发布确认等保证了MQ的可靠性。
- 灵活的分发消息策略。这应该是RabbitMQ的一大特点。在消息进入MQ前由Exchange(交换机)进行路由消息。分发消息策略有:简单模式、工作队列模式、发布订阅模式、路由模式、通配符模式。
- 支持集群。多台RabbitMQ服务器可以组成一个集群,形成一个逻辑Broker。
- 多种协议。RabbitMQ支持多种消息队列协议,比如 STOMP、MQTT 等等。
- 支持多种语言客户端。RabbitMQ几乎支持所有常用编程语言,包括 Java、.NET、Ruby 等等。
- 可视化管理界面。RabbitMQ提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker。
- 插件机制。RabbitMQ提供了许多插件,可以通过插件进行扩展,也可以编写自己的插件。
使用消息队列的优缺点(场景举例)
优点
1.松耦合
不引入MQ,系统间进行通讯时耦合性很高,倘若其他系统出现异常、对消息的接收状态发生改变、增加了某个需要进行发送消息的系统等情况我们进行数据发送的系统都要进行适配处理。
但是引入了MQ以后,通过MQ消息的生产者不需要管消息发送给谁,消息的消费者需要哪些数据就去MQ中进行消费,不需要消息可以进行取消MQ消费操作。
2.异步
举一个电商项目的例子,当浏览器发送一个下单请求给我们的时候,我们可能调用订单模块、购物车模块、支付模块等,倘若消耗的时间为100ms、100ms、200ms,那么下单这个请求完成就需要耗费400ms。当我们引入MQ以后,这几个模块进行消息处理可以是异步的,即耗时为用时最长的那个模块,即200ms。
3.削峰
我们都知道在双11等活动,用户流量是特别大的,当大量的用户发起请求很有可能造成数据库崩溃。但是平日里请求又没有那么多。倘若双11,每秒并发请求为4000,而系统基于mysql每秒只能处理请求数量为1000.这个时候引入MQ就可以把这4000个请求放在消息队列里每秒处理1000个请求,等到高峰期过了,并发量没那么大,慢慢的将消息队列中的请求处理完毕。通过引入MQ,进行流量削峰,防止大量请求直接打到服务器,造成系统崩溃。
缺点
1.系统可用性降低
引入mq,万一mq挂掉整套系统将崩溃,所以引入mq要考虑消息队列的高可用。
2.系统复杂度提高
引入三方中间件,维护成本将变高并且还要保证消息不被重复消费、保证消息顺序性、如何消息不丢失等问题。
3.一致性问题
当异步场景下,系统A下发mq后直接返回浏览器成功,用户认为这个请求已经成功了,但是B系统写库成功、C系统写库失败,就会造成不一致的问题。
安装RabbitMQ(win10)
安装erlang并配置环境变量
安装erlang,配置环境变量,我这里电脑是64位直接点击即可下载,官网地址Downloads - Erlang/OTP
下载完毕后默认勾选,自定义安装目录后一直next就好。
安装完毕接下来我们配置一下环境变量
先新增系统变量ERLANG_HOME
新增Path
新增完毕后,cmd输入erl -version,出现下边版本号则环境变量配置正确。
安装RabbitMQ服务端
首先进入RabbitMQ官网Messaging that just works — RabbitMQ
进入官网向下拉,找到 Download + Installation 下载+安装,点击进入。
选择Install:Windows![](https://i-blog.csdnimg.cn/blog_migrate/146b9d0214e92069ab0a58c52af58b8f.png)
页面下拉找到Dependencies进行Download
下载完毕后默认勾选,自定义安装目录后一直next就好。
进入到安装目录的sbin目录
在此目录路径下输入cmd并回车,打开CMD界面
输入rabbitmq-plugins enable rabbitmq_management命令安装管理页面的插件:
此时可以搜索服务看RabbitMQ服务是否启动