为什么要使用消息队列

本文最后更新于:2021年9月20日 上午

为什么要使用消息队列呢,使用消息队列和不使用消息队列有什么区别,本文作为消息队列的一个开端,理解本文很重要,永远明白需求驱动技术的发展

为什么使用消息队列

简答

  1. 异步处理:相对于传统的串行、并行模型,消息队列可以增加系统的吞吐量
  2. 应用解耦:系统间通过消息通信,不需要关心其他系统的处理
  3. 平稳流量:可以通过控制消息队列总长度来控制最大请求并发量,来缓解瞬时高并发请求
  4. 日志处理:解决不同机器之间的日志输出问题
  5. 消息通讯:消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯。比如实现点对点消息队列,或者聊天室等

详解

异步处理

这个很简单,我们拿12306来举例,当用户在锁定一张票之后会有支付流程,支付完成之后会发短信提示用户出行记录,这个时候就需要支付模块去调用短信模块,如果短信模块的响应时长是300ms,那么整个系统的耗时就是支付耗时+短信模块响应时长。在使用了MQ之后就只需要计算支付耗时+插入MQ的时间。

解除耦合

还是那12306举例,支付流程之后如果是去调用短信模块,那么支付模块就耦合了短信模块,一个模块暂时还可以接受,但是如果这时候需要新增一个微信通知模块,一个邮件通知模块,那么一个支付流程就耦合了多个模块,并且如果这个时候需要撤销邮件通知,且邮件模块有和其他流程有点关系,那么。。。祝你还有头发吧。

在使用了MQ之后可以将支付完成的信息发送到MQ中,那么订阅了这条信息的程序就会收到信息并自己处理。

平稳流量

依旧12306,在放票的那一瞬间流量就达到的高峰,如果任意让那么多流量直接打到服务器,服务器可能一时间处理不了那么多请求,这个时候我们可以使用MQ来控制请求的最大并发量(用其他的也可以),来缓解并发量

缺点

系统可用性降低

无论是异步处理还是解除耦合,都要依赖MQ的高可用,实际上MQ充当的就是一个信使的作用,如果信使都挂了,那么整个系统就瞬间炸裂

系统复杂度降低

一个系统每新增一个组件就要增加十倍的复杂度

一致性问题

A 系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是 BCD 三个系统那里,BD 两个系统写库成功了,结果 C 系统写库失败了,咋整?你这数据就不一致了。

总结

欲戴王冠,必承其重


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!