个人博客地址:
http://xiaohe-blog.top/
1. MQ基本概念
1.1 MQ简述
MQ 全称 :Message Queue
(消息队列),是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。
分布式系统完成通信有两种方式:
- 直接通信 :A直接远程调用B。
- 间接通信 :A先将信息发给C,C再发给B。
发送消息的的称为生产者
,接收信息的称为消费者
。
1.2 MQ的优势
-
应用解耦
我们一直追求的编码方式就是 高内聚,低耦合,并且在这上面花了很大心思,
高内聚,低耦合
也是我们评价一个技术/框架是否优秀的重要方式,MQ在就这方面做的非常好。使用直接远程调用的方式,A调用B、C、D完成业务,如果我们想要将B业务删除,那么就要疯狂改A业务中的代码,十分麻烦。
而如果使用MQ消息队列,想将B删除,只需要关闭MQ与B的消息通道;以后如果想将B恢复使用,还可以恢复消息队列通向B的消息通道。
-
异步提速
一个客户端请求发送进来,系统A会调用系统B、C、D三个系统,同步请求的话,响应时间就是系统A、B、C、D的总和。如果使用MQ,系统A发送数据到MQ,然后就可以返回响应给客户端,不需要再等待系统B、C、D的响应,可以大大地提高性能。对于一些非必要的业务,比如发送短信,发送邮件等等,就可以采用MQ。
-
削峰填谷
假设系统A在某一段时间请求数暴增,有5000个请求发送过来,系统A这时就会发送5000条SQL进入MySQL进行执行,MySQL对于如此庞大的请求当然处理不过来,MySQL就会崩溃,导致系统瘫痪。
如果使用MQ,系统A不再是直接发送SQL到数据库,而是把数据发送到MQ,MQ短时间积压数据是可以接受的,然后由消费者每次拉取2000条进行处理,防止在请求峰值时期大量的请求直接发送到MySQL导致系统崩溃。
1.3 MQ的劣势
-
系统可用性降低
在远程直接调用中,我们只需要保证已有业务不出错就行了。
使用了MQ,我们还要维护MQ,而维护的越多,bug出现的机率越高。
-
系统复杂度提高
这个是肯定的,远程直接调用虽然不好看,但是好写。而且我们要保证信息没有被MQ重复发送、重复接收、信息丢失问题等等…
-
一致性问题
A调用B、C、D业务功能,如果B、C成功了,但是D失败了,该如何处理数据的一致性问题?
2. RabbitMQ基本概念
2.1 RabbitMQ特点
(从网上搜的)
RabbitMQ是一款使用Erlang语言开发的,实现AMQP
(高级消息队列协议)的开源消息中间件。首先要知道一些RabbitMQ的特点,官网可查:
- 可靠性 :支持持久化,传输确认,发布确认等保证了MQ的可靠性。
- 灵活的分发消息策略 :这应该是RabbitMQ的一大特点。在消息进入MQ前由Exchange(交换机)进行路由消息。分发消息策略有:简单模式、工作队列模式、发布订阅模式、路由模式、通配符模式。
- 支持集群 :多台RabbitMQ服务器可以组成一个集群,形成一个逻辑Broker。
- 多种协议 :RabbitMQ支持多种消息队列协议,比如 STOMP、MQTT 等等。
- 支持多种语言客户端 :RabbitMQ几乎支持所有常用编程语言,包括 Java、.NET、Ruby 等等。
- 可视化管理界面 :RabbitMQ提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker。
- 插件机制 :RabbitMQ提供了许多插件,可以通过插件进行扩展,也可以编写自己的插件。
2.2 AMQP协议
AMQP :Advanced Message Queuing Protocol
(高级消息队列协议),一个网络协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受开发语言、不同产品等条件的限制。