MQ 主要就是用来发送和接收处理消息,但它的作用可不仅解决应用间通信问题。
1 MQ 的现实由来
在工厂我们随处可见各种传送带,很多道工序都替代了人工一次次极大耗费劳动力的往返运动,而把一套业务分成若干部分,各流程之间传输所需材料即可。用编程思想,我们可以认为是传送带的发明解决了上下游工序间的“通信”问题。
传送带的使用着实提高社会必要劳动生产时间,让人类工业社会效率显著提升。但就真的百利无一害了吗?
我们会发现每道工序生产速度并不相同。有时上游的材料刚传送过来,工人可能正在处理上批材料,没有时间接收。不同工序的工人必须协调好什么时间往传送带上放置材料,若出现上下游工序速度不一致,上下游工人之间就得互相等待,确保不会出现传送带上的半成品材料挤压太多,无人接收!
为解决该问题,在每组工序下游配备个暂存仓库,这样上游工人就不用等下游工人有空,任何时间都可把加工完成的半成品丢到传送带,无法接收的就被暂存在仓库,下游工人可随时来取。
配备的仓库就起到了“通信”过程中“缓存”作用。
这就是现实版的消息队列。
2 消息队列适用场景
理解了消息队列由来,看看开发中,何时需要 MQ 呢?
2.1 异步处理
跨系统的异步通信(最早使用的有IBM MQ)或者应用内的同步变成异步(秒杀)。
比如面试常客秒杀系统,一个秒杀请求可能包含很多步骤:
- 风控
- 锁库存
- 生成订单
- 通知
- 更新统计数据
最低级的同步处理流程:App将请求发送给网关,依次调用上述流程,然后将结果返回给APP。
决定秒杀成功与否的实际上只有风控和锁库存。只要用户请求通过风控,并在Server完成库存锁定,就可给用户返回秒杀结果,对于后续生成订单、短信通知和更新统计数据等,并不一定要在秒杀请求中处理完。
所以当服务端完成前2步,确定本次请