起源:blog.csdn.net/qq_44240587/article/details/104630567
前言
近期有了想跳槽的打算,所以本人想坚固一下本人的技术,想理解一些面试比拟容易加分的项,近期筹备深入研究一下Redis和MQ这两样,这总体上都是为了解决服务器并发的起因,刚翻到了一篇有对于MQ的,感觉写得特地好,特此记录一下,也算是为了加深本人的印象。
面试题切入
- 为什么要应用MQ
- 音讯队列有什么长处和毛病
- kafka、ActiveMQ、RabbitMQ、RocketMQ有什么区别
面试官心理剖析
首先,你们零碎外面为什么要用MQ
不少去面试的人,都晓得本人以前我的项目外面用过MQ、Redis,然而为什么用这个,却不晓得,这种人说白了就是为了用而用,又或者这个框架就是他人设计的,他本人都没理解过外面的货色,天然也不晓得为什么要用。如果面试的时候面试官问你这种问题你答不上来,可能曾经被pass百分之三十了,面试官通常对这种人印象很不好,他怕你进了公司只会埋头苦干,不懂得本人思考。
第二,你既然用了MQ,那你知不知道MQ有什么益处和害处
如果没思考过这个问题肯定要谨慎答复,因为你没思考过这个,自觉的弄个MQ进零碎,当下的问题可能是解决了,但万一前面出了问题不是给公司留坑吗,面试官就怕这样的人,招进来干了一年,本人跳槽了,给零碎挖一堆坑,留下无穷祸害。
第三,既然你用了MQ,比方其中一种MQ,那你过后做没做过调研
别看他人用了MQ,咦,感觉挺好的,就本人瞎弄了一个,基本没思考过MQ的选型,比方kafka,每个MQ并没有相对的益处和害处,当初业界风行的MQ各有各的益处,各有各的害处,你要做的就是取长补短,筛选最适宜本人零碎的MQ。
面试题分析
①为什么要应用MQ
其实面试官问你这个问题就是想晓得,你们公司有个什么样的业务场景,这个业务场景有个什么技术挑战,如果不必MQ可能会比拟麻烦,包含当初用了MQ当前有哪些益处等等。先说一下MQ常见的应用场景吧,MQ的应用场景有很多,然而比拟外围的就是:解耦、异步、削锋。
零碎解耦
首先举例上面这个场景,现有ABCDE五个零碎,最后的时候BCD三个零碎都要调用A零碎的接口获取数据,所有都很失常,然而忽然,D零碎说:我不要了,你不必给我传数据了,A零碎无奈,只能批改代码,将调用D零碎的代码删除,这时候还没删除呢,E零碎发送了申请,然而A零碎这时候还没解决完D零碎的申请,A零碎卒!!!彻底解体。看下图↓↓↓↓↓↓↓↓↓↓↓
上述场景中,BCDE都须要用到A零碎提供的数据,A零碎跟其余四个零碎重大耦合,须要时时刻刻思考其余四个零碎要是挂了怎么办,需不需要从新发送数据给他们,这个时候的A零碎心田是解体的。
然而如果应用了MQ之后 ,A零碎的数据只须要放到MQ外面,其余的零碎想申请获取数据只须要去MQ外面生产即可,如果忽然不想申请了,就勾销对MQ的生产就行了,A零碎基本不须要思考给谁去响应这个数据,也不须要去保护代码,也不必思考其余零碎是否调用胜利,失败超时等状况。具体看下图↓↓↓↓↓↓↓↓
另外,MQ 系列面试题和答案全副整顿好了,微信搜寻Java技术栈,在后盾发送:面试,能够在线浏览。
面试技巧:你须要思考一下,在你本人的零碎外面有没有相似的状况,一个零碎或者模块,调用了多个零碎或者模块,它们相互之间的调用非常复杂,并且保护起来很麻烦,但其实这个调用是不须要间接同步调用接口的,如果用MQ给它异步化解耦也是能够的,你就须要思考在你的我的项目里,是不是能够用MQ给它进行零碎的解耦,能够本人组织一下语言答复。
异步调用
场景二,还是ABCD四个零碎,A零碎收到一个申请,须要在本人本地写库,还须要往BCD三个零碎写库,A零碎本人写本地库须要3ms,往其余零碎写库绝对较慢,B零碎200ms ,C零碎350ms,D零碎400ms,这样算起来,整个性能从申请到响应的工夫为3ms+200ms+350ms+400ms=953ms,靠近一秒,对于用户来说,点个按钮要等这么长时间,根本是无奈承受的,侧面也反映出这家研发人员技术不咋地。详情如下图↓↓↓↓↓↓
个别的互联网企业,对于用户申请响应的工夫要求在100ms-200ms之间,这样,用户的眼睛存在视觉暂停景象,用户响应工夫在此范畴内就能够了,所以下面的景象是不可取的。
如果用了MQ,用户发送申请到A零碎耗时3ms,A零碎发送三条音讯到MQ,如果耗时5ms,用户从发送申请到相应3ms+5ms=8ms,仅用了8ms,用户的体验十分好。
流量削峰
场景三,这次举个实例吧,也是近期产生的,咱们都晓得 ,2020年暴发的这场新冠病毒,导致各大线上商城APP外面的口罩被抢购一空,在这种状况下,JD商城开启了一场每晚八点的抢购3Q口罩的流动,每天下午三点进行预约,早晨八点抢购,从JD商城刚上线这个流动,我间断抢了近一个周,也算是见证了一个百万并发量零碎从呈现问题到欠缺的一个过程。
最后第一天,我抢购的时候,一百多万预约,到八点抢购预计也能有百万的并发量,可是第一天,到八点我抢的时候,因为并发量太高,间接把JD服务器弄崩了,间接报了异样,可能JD在上线这个流动的时候也没可能想到会有那么高的并发,打了一个猝不及防,然而这只是在前一两天呈现报异样的状况,前面却没有再出现异常信息,到起初再抢购只是响应的工夫变得很慢,然而JD零碎并没有解体,这种状况下个别就是用了MQ(或者之前用了MQ,这次换了个吞吐量级别更高的MQ),也正是利用了MQ的三大益处之一——削峰。
JD零碎每天0—19点,零碎惊涛骇浪,后果一到八点抢购的时候,每秒并发达到百万,假如JD数据库没秒能解决1.5w条并发申请(并非理论数据,次要为了举例),到八点抢购的时候,每秒并发百万,这间接导致系统异样,然而八点一过,可能也就几万用户在线操作,每秒的申请可能也就几百条,对整个零碎毫无压力。
如果应用了MQ,每秒百万个申请写入MQ,因为JD零碎每秒能解决1W+的申请,JD零碎解决完而后再去MQ外面,再拉取1W+的申请解决,每次不要超过本人能解决的最大申请量就ok,这样下来,等到八点高峰期的时候,零碎也不会挂掉,然而近一个小时内,零碎解决申请的速度是必定赶不上用户的并发申请的,所以都会积压在MQ中,甚至可能积压千万条,然而高峰期过后,每秒只会有一千多的并发申请进入MQ,然而JD零碎还是会以每秒1W+的速度解决申请,所以高峰期一过,JD零碎会很快消化掉积压在MQ的申请,在用户那边可能也就是等的工夫长一点,然而相对不会让零碎挂掉。
音讯队列的优缺点
长处
下面曾经说过了,零碎解耦,异步调用,流量削峰。
毛病
①零碎可用性升高: 零碎引入的内部依赖越多,零碎要面对的危险越高,拿场景一来说,原本ABCD四个零碎配合的好好的,没啥问题,然而你偏要弄个MQ进来插一脚,尽管益处挺多,然而万一MQ挂掉了呢,那样你零碎不也就挂掉了。
②零碎复杂程度进步: 非要加个MQ进来,如何保障没有反复生产呢?如何解决音讯失落的状况?怎么保障消息传递的程序?问题太多。
③一致性的问题: A零碎解决完再传递给MQ就间接返回胜利了,用户认为你这个申请胜利了,然而,如果在BCD的零碎里,BC两个零碎写库胜利,D零碎写库失败了怎么办,这样就导致数据不统一了。
所以。音讯队列其实是一套非常复杂的架构,你在享受MQ带来的益处的同时,也要做各种技术计划把MQ带来的一系列的问题解决掉,等所有都做好之后,零碎的复杂程度硬生生进步了一个等级。
四大支流MQ(kafka、ActiveMQ、RabbitMQ、RocketMQ)各自的优缺点
目前业界四大支流的MQ有kafka、ActiveMQ、RabbitMQ、RocketMQ。其余的MQ也有,不过比拟冷门。就不必多说了,画个表就明确了。↓↓↓↓↓↓↓↓
综上所述,各种比照之后,我集体偏向于是:
个别的业务零碎要引入MQ,最早大家都用ActiveMQ,然而当初的确大家用的不多了,没通过大规模吞吐量场景的验证,社区也不是很沉闷,所以大家还是算了吧,我集体不举荐用这个了;
起初大家开始用RabbitMQ,然而的确erlang语言阻止了大量的java工程师去深入研究和掌控他,对公司而言,简直处于不可控的状态,然而的确人是开源的,比较稳定的反对,活跃度也高;
不过当初的确越来越多的公司,会去用RocketMQ,的确很不错,然而我揭示一下本人想好社区万一忽然黄掉的危险,对本人公司技术实力有相对自信的,我举荐用RocketMQ,否则回去老老实实用RabbitMQ吧,人是沉闷开源社区,相对不会黄
所以中小型公司,技术实力较为个别,技术挑战不是特地高,用RabbitMQ是不错的抉择;大型公司,基础架构研发实力较强,用RocketMQ是很好的抉择
如果是大数据畛域的实时计算、日志采集等场景,用Kafka是业内规范的,相对没问题,社区活跃度很高,相对不会黄,何况简直是全世界这个畛域的事实性标准
ok,音讯队列写到这里就完结了,记得点个在看!!!!!
近期热文举荐:
1.1,000+ 道 Java面试题及答案整顿(2022最新版)
2.劲爆!Java 协程要来了。。。
3.Spring Boot 2.x 教程,太全了!
4.别再写满屏的爆爆爆炸类了,试试装璜器模式,这才是优雅的形式!!
5.《Java开发手册(嵩山版)》最新公布,速速下载!
感觉不错,别忘了顺手点赞+转发哦!