消息队列是什么,为什么要使用消息队列中间件

1,136 阅读2分钟

1、消息队列是什么

不是人话的解释:MQ是模块与模块之间的交互消息进行存储和管理的容器


其实就是把要发给别的系统的消息先放到MQ里面,别的系统再去MQ里面拿。


看上去,模块与模块之间交互多了一层,反而更容易出现问题,那为啥要用MQ呢。


2、为什么要使用消息队列中间件

主要有3个应用场景:解耦、异步、削峰

  • 解耦

原本服务间的调用是这样的



负责服务A的老哥当时就不愿意了:你动一下我就得改一下,维护起来很麻烦啊

嫌麻烦的A老哥引入了MQ之后


A老哥:这样就舒服了嘛,不用我改了

  • 异步

举个例子,用户下单创建订单,如果按下面流程的话需要1秒多时间,用户体验特别不好。


仔细观察可以发现创建订单计算库存速度其实不慢,慢的在最后一步的发货算法(当然事实肯定不是这样,只是打个比方)

那我晚个一会再给你安排发货也没问题啊,那是不是可以把安排发货这个操作从这个调用链路里面抽离出来,做个一个异步。

用户现在下单,只要创建完订单,计算好库存就可以给响应了


现在只有100ms就回馈给用户啦,剩下发货服务器慢慢计算就好。

  • 削峰

比如系统平时每秒也就几百请求

但是偶尔会有高峰期达到每秒1000请求的,但是服务器承受不住,所以只能增加多两台服务器。



但是想想为了偶尔的高峰加多两台服务器好像有点浪费,不加又面临系统扑街的危险。

咋办?


遇到高峰期的时候把请求先积压在MQ里面 ,服务器再慢慢处理,处理速度会慢一点,但是保证了系统不会挂掉。

3、引入MQ又有啥缺点

导致数据暂时不一致

系统A把消息放进MQ后,系统B消费之前这个数据是不一致的。所以达到的是“最终一致“而不是”强一致“。  

系统稳定性降低

MQ作为一个组件,也是有挂掉的可能的。或者偶尔有时候系统抽风又多发了一条一样的消息进MQ,这就会产生脏数据。所以又要考虑集群部署和幂等性的问题