一、概述
凡事得知其然也要知其所以然,方能串联起各个知识,形成知识体系,使用起来游刃有余。
二、为什么要使用消息队列?
消息队列的使用场景很多,但是比较核心的有 3 个:解耦、异步、削峰。下面一一来剖析这三个核心场景。
解耦:
通过工作中应用java技术,我们已经掌握了java中的强耦合以及如何解藕。强耦合就是牵一发而动全身。例如A,B两个类,B类要调用A类的方法,那么将A 类作为参数传递,试想,如果增加C,D,E类,B类又想调用他们的方法咋办,这时只能修改B类的方法,这样的程序设计耦合性很高。
因此,要实现解耦,我们可以利用多态思想,通过接口的方式来实现程序的解耦。改进后就在B中传递对应的接口即可。再看消息队列,它的耦合是看如下场景。
例如A 系统发送数据到 BCD 三个系统,通过接口调用发送。如果 E 系统也要这个数据呢?那如果 C 系统现在不需要了呢?A 系统负责人几乎崩溃,总是需要修改代码。
流程图引用自网络在该场景中,很明显A系统跟其他几个系统产生了强耦合性,A系统随时都要考虑到其他系统是否挂掉的情况,如果其他系统挂掉了,还需要重发,这样就比较麻烦了。
为了解决这个问题,进一步思考,我们是否可以使用一个消息队列解决。将消息放到消息队列来,哪个系统需要就来取(消费)就是,不需要就不取(不消费)。这样解决的话,A系统就不需要再考虑到其他系统 挂掉的情况,也不需要维护这个代码,正如下图所解。
流程图引用自网络备注
系统间通过接口方式调用:执行http请求,拼接访问接口地址,添加http请求必要参数,执行调用。多个系统间就需要拼接多个调用地址。
Topic模式:将消息队列的生产目的地设置为topic模式,就可以实现多个消费者同时接收一个队列的消息。
异步:
异步的概念在消息中间件产生背景的文章中有具体阐述,详见https://www.jianshu.com/p/ba3a7e8c2954。在没使用消息队列之前是同步的,看这么一个场景。
A 系统接收一个请求,需要本地鞋库,并且还需要在 BCD 三个系统写库,假设自己本地写库要 3ms,BCD 三个系统分别写库要 300ms、450ms、200ms。最终请求总延时是 3 + 300 + 450 + 200 = 953ms,接近 1s。用户发送请求后,1s后才收到响应,这个时相当慢的。
流程图摘自网络分析此问题,我们是否可以当用户对A系统调用,A系统本地处理后,调用B,C,D三个系统接口处理业务的操作用消息队列来缓冲,此时就返回给用户响应信息。进一步分析,将B,C,D三个系统需要的业务数据放到MQ中,B,C,D分别取对应的消息队列中取出消费。这样就会将B,C,D业务处理的时间大大缩短。
具体为:用户对A系统发送请求,A系统处理后,再将用户请求信息通过发布、订阅通信模型放到MQ,返回给用户,至于B,C,D三个系统分别从MQ中消费,是后续的事情,以这样的方式实现异步操作。
发布/订阅通信模型:联想到微信发布订阅,如果用户关注一个公众号(订阅号),那么只要关注了的用户就可以收到订阅号产生的消息,没关注则不会收到,相当于消费被重复消费。具体到MQ,使用生成目的地创建topic的方式就可以实现消息多个系统消费。
削峰:
回想之前物理学学的波,有波峰和波谷,波峰就是在坐标轴向上的值达到的某一峰值。在计算机峰值中,通常为流量的峰值,比如某一时刻并发量高达5K+这样一个最大值。
请看这样一个场景,每天 0:00 到 12:00,A 系统风平浪静,每秒并发请求数量就 50 个。结果每次一到 12:00 ~ 13:00 ,每秒并发请求数量突然会暴增到 5k+ 条。系统是直接基于 MySQL 的,意味着大量的请求涌入 MySQL,每秒钟对 MySQL 执行约 5k 条 SQL。
对于一般的 MySQL,扛到每秒 2k 个请求就差不多了,如果每秒请求到 5k 的话,可能就直接把 MySQL 给打死了,导致系统崩溃,用户也就没法再使用系统了。
但是高峰期一过,到了下午的时候,就成了低峰期,可能也就 1w 的用户同时在网站上操作,每秒中的请求数量可能也就 50 个请求,对整个系统几乎没有任何的压力。
图片摘自网络为了MySQL服务的正常运行,思考需要一个中间件将5K+的请求存储起来,然后让MySQL慢慢的去执行,这样就不会对MySQL服务造成冲击。使用点对点通信模型,将请求的内容存入MQ中,然后让MySQL慢慢的从MQ中每秒取出2K请求并处理,这样哪怕是高峰期,MySQL服务也不会挂掉。
重要概念:
并发:多个事件在同一时间段发生。比如食堂中两个队列在一个窗口打饭。
并行:并排行走,多个事件在同一时刻同时发生。比如食堂两个队列在两个窗口打饭。
并发请求数量-QPS(Query Per Second)/RPS(Request Per Second):每秒程序处理的请求数量。比如食堂中两个队列在一个窗口打饭,每段时间服务的学生的人数,但是放到计算机来处理,感觉就是同时执行,就像开启了两个窗口,因为计算机处理速度很快。
高并发:服务每秒能稳定的处理大量请求。
点对点通信模型:相当于两个人相互添加微信,一个人发送消息给指定人,只能被指定的那个人接收到,其他人是不能接收到消息的。MQ中将生产者目的地使用为Queue即可。
网友评论