为什么要引入消息队列之异步削峰解耦


消息队列其实就是用一个队列存储消息,我们可以从中获取消息并处理。

1. 消息队列的三大用处

异步、削峰、解耦

  1. 异步处理提高系统性能(减少响应时间)
  2. 削峰:就是限流
  3. 解耦:降低系统耦合性,更好维护,拓展性更高

1.1. 异步

  1. 为什么要异步

传统场景下,客户端发起某个请求,假如说是下单吧,那负责下单的系统,不仅要进程支付功能的调用,更新库存,还要发送下单成功通知等。最后再返回一个状态说我都做完了,你可以做其他事了。用户这边体验就很差,下个单要等这么久。

如果全交给这一个系统做这一连串的事,那就很慢。

  1. 加入消息队列怎么解决

其实就是负责下单的系统接收到请求后,就发送消息到消息队列,那其他订阅了这个消息队列的系统就可以进行消费,然后做自己该干的事,而发送消息的系统直接就返回给用户说明下单成功。这样看来,用户的体验就很快。

比如下单后,要过一段时间才会收到短信提醒。

2. 削峰

简单来说就是拿消息队列做一层类似缓冲的作用,大量请求来到就先存在消息队列,然后消费者再慢慢吸收这些消息,防止大量请求打到数据库,Mysql 数据库一般 QPS 两千就差不多了,如果再多可能就崩了。

3. 解耦

  1. 为啥需要解耦捏

传统场景下,一个系统要给多个系统发送”消息”的时候,需要考虑下面几个问题。

  • 每个系统是不是都需要这个消息,假如又有新系统也要这个数据怎么办?再重发一次嘛?还是说要存一下,那也太消耗空间了。
  • 如果消费者系统挂了,要不要重发?
  • ……

所以对于一个系统来说,压力太大,耦合度太高,万一这个系统也崩了,那整个项目也就寄的差不多了。

  1. 引入消息队列后怎么解决的

简单来说的话,就是生产者系统只需要关注消息的发送,而不用考虑后续出现的问题,比如一个系统想向其他系统发送消息,只需要把消息送到消息队列,然后就不管了,接下来与这个业务相关的系统就可以从消息队列中自行读取。

通过消息队列中的订阅-发布模式就可以让订阅了这个队列的消费者接收到请求并进行处理,也就实现了解耦。

  1. 结合自己的项目
  • #task 结合自己的项目考虑为什么要引入消息队列 🔽 ✅ 2024-01-31

参考:引入消息队列,重构短链接重定向时访问较慢的问题(流量削峰)

面试技巧:你需要去考虑一下你负责的系统中是否有类似的场景,就是一个系统或者一个模块,调用了多个系统或者模块,互相之间的调用很复杂,维护起来很麻烦。但是其实这个调用是不需要直接同步调用接口的,如果用 MQ 给它异步化解耦,也是可以的,你就需要去考虑在你的项目里,是不是可以运用这个 MQ 去进行系统的解耦。在简历中体现出来这块东西,用 MQ 作解耦。


文章作者: KTpro
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 KTpro !
评论
  目录