一、MQ是什么?
1、MQ全称为Message Queue 消息队列(MQ),一种先进先出的数据结构,是一种应用程序对应用程序的通信方法。MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取队列中的消息。消息发布者只管把消息发布到 MQ 中而不用管谁来取,消息使用者只管从 MQ 中取消息而不管是谁发布的。这样发布者和使用者都不用知道对方的存在。
2、RocketMQ作为一款分布式的消息中间件,经历了淘宝双十一的洗礼,在功能和性能上远超ActiveMQ
3、你可以想想在生活中的一种场景:当你把信件投进邮筒,邮递员肯定最终会将信件送给收件人。我们可以把MQ比作 邮局和邮递员。 MQ和邮局的主要共同点是:它不处理消息,但是,它会接受数据、存储消息数据、转发消息

 

 二、MQ有什么特点。
主要围绕三点:解耦、异步、削峰。
1、解耦:
传统模式的调用如下

 

 系统的耦合度越高,容错性越低。以电商为例,用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出现故障或者升级等原因暂时不可用,都会造成下单操作异常,影响用户使用体验。

 

 

使用消息队列解耦合,系统的容错性就高了。比如物流系统发生故障,需要几分钟才能来修复,在这段时间内,物流系统要处理的数据被缓存到消息队列中,用户的下单操作正常完成。当物流系统恢复上线后,补充处理存在消息队列中的数据即可,终端系统感知不到物流系统发生过几分钟的故障。

2、异步:
传统调用模式:

 

 

在某场景下,A系统收到一条数据后需要在自己本地写库,同时还要在BCD三个系统写库,自己本地写库要 3ms,BCD 三个系统分别写库要 300ms、450ms、200ms。总共要延时3 + 300 + 450 + 200 = 953ms,接近 1s啊,对强迫症的人来说简直要爆炸!

使用MQ之后:

 

 

如果使用 MQ,那么 A 系统连续发送 3 条消息到 MQ 队列中,假如耗时 5ms,A 系统从接受一个请求到返回响应给用户,总时长是 3 + 5 = 8ms,对于用户而言,其实感觉上就是点个按钮,8ms 以后就直接返回了,那就比原来传统模式同步调用快了。

3、流量肖锋:

 

 

A系统如果遇到请求流量瞬间猛增,有可能会将系统压垮。有了消息队列可以将请求缓存起来,分散到很长的一段时间处理,这样可以大大提高系统的稳定性和用户体验。

 

 

 

一般情况下,为了保证系统的稳定性,如果系统负载超过阈值,就会阻止用户请求,这会影响用户体验,而如果使用消息队列将用户请求缓存起来,等待系统处理完毕后通知用户下单完毕,这样比不能下单体验要好。

三、MQ的缺点。
1、系统可用性降低。
系统引入的外部依赖越多,越容易挂掉。本来你就是 A 系统调用 BCD 三个系统的接口就好了, ABCD 四个系统好好的,没啥问题。但是你偏偏要在系统A和BCD之间加个MQ,好了,MQ一挂,整套系统就蹦,A就调不到BCD了。
2、增加了系统的复杂度。
硬生生加个MQ进来,怎么保证消息没有重复消费?消息丢失的情况?消息的传输顺序性?问题一大堆,都得一一的去处理。