为什么要使用消息队列呢,使用消息队列和不使用消息队列有什么区别,本文作为消息队列的一个开端,理解本文很重要,永远明白需求驱动技术的发展
为什么使用消息队列
简答
- 异步处理:相对于传统的串行、并行模型,消息队列可以增加系统的吞吐量
- 应用解耦:系统间通过消息通信,不需要关心其他系统的处理
- 平稳流量:可以通过控制消息队列总长度来控制最大请求并发量,来缓解瞬时高并发请求
- 日志处理:解决不同机器之间的日志输出问题
- 消息通讯:消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯。比如实现点对点消息队列,或者聊天室等
详解
异步处理
这个很简单,我们拿12306来举例,当用户在锁定一张票之后会有支付流程,支付完成之后会发短信提示用户出行记录,这个时候就需要支付模块去调用短信模块,如果短信模块的响应时长是300ms,那么整个系统的耗时就是支付耗时+短信模块响应时长。在使用了MQ之后就只需要计算支付耗时+插入MQ的时间。
解除耦合
还是那12306举例,支付流程之后如果是去调用短信模块,那么支付模块就耦合了短信模块,一个模块暂时还可以接受,但是如果这时候需要新增一个微信通知模块,一个邮件通知模块,那么一个支付流程就耦合了多个模块,并且如果这个时候需要撤销邮件通知,且邮件模块有和其他流程有点关系,那么。。。祝你还有头发吧。
在使用了MQ之后可以将支付完成的信息发送到MQ中,那么订阅了这条信息的程序就会收到信息并自己处理。
平稳流量
依旧12306,在放票的那一瞬间流量就达到的高峰,如果任意让那么多流量直接打到服务器,服务器可能一时间处理不了那么多请求,这个时候我们可以使用MQ来控制请求的最大并发量(用其他的也可以),来缓解并发量
缺点
系统可用性降低
无论是异步处理还是解除耦合,都要依赖MQ的高可用,实际上MQ充当的就是一个信使的作用,如果信使都挂了,那么整个系统就瞬间炸裂
系统复杂度降低
一个系统每新增一个组件就要增加十倍的复杂度
一致性问题
A 系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是 BCD 三个系统那里,BD 两个系统写库成功了,结果 C 系统写库失败了,咋整?你这数据就不一致了。
总结
欲戴王冠,必承其重