为什么使用MQ

我认为使用 mq 主要是为了下面几个目的,实现分布式系统之间的解耦调用、实现异步调用和削峰(队列),解决高并发问题。

  1. 实现分布式系统之间的解耦调用

    在分布式系统中,经常会出现一个服务会有多个消费端调用,而且可能每个消费方需要接入的逻辑不一致,又或者随着项目的不断发展,我们需要接口的未来维护和发展确定一套可扩展的规范,引入消息系统,在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口。

    这允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。

  2. 实现异步调用

    有时候我们会遇到这样的场景,用户在客户端提交了一个请求,后端处理这个请求的业务相对比较复杂,如果这个请求使用的是同步调用,客户端就会出现发送请求后过了很久才相应的情况,这对用户体验来说是十分致命的。

    如果说用户并不关心请求是否处理,对于一些耗时的非事务性的业务处理,我们可以使用 mq 异步请求的方式,将处理信息放入队列,由后端监听队列自行处理,在将消息存入队列后直接返回客户端相应,加快响应速度。

  3. 削峰(队列)解决高并发问题

    例如秒杀活动,可能在短时间内会有很大请求同时到后端,如果后端对每个请求都执行业务操作,例如查询数据库和写数据库,会造成服务器压力过大。同时,在同一时间进行大量数据库操作,可能会出现数据异常,我们可以使用 mq 实现缓冲,将所有请求先放入消息队列中,服务端每次处理业务先从消息队列获取。

使用mq的缺点

  1. 系统可用性降低

你想啊,本来其他系统只要运行好好的,那你的系统就是正常的。现在你非要加个消息队列进去,那消息队列挂了,你的系统不是呵呵了。

因此,系统可用性降低,这个问题我们可以通过部署高可用 mq 解决,但这又会引发下面的问题。

  1. 系统复杂性增加

    要多考虑很多方面的问题,比如一致性问题、如何保证消息不被重复消费,如何保证保证消息可靠传输,出现问题需要排查的范围扩大。因此,需要考虑的东西更多,系统复杂性增大。

总结

mq 是互联网架构解耦和解决高并发的常用方式。