乐趣区

关于java:面试官必问的-3-道-MQ-面试题还有谁不会

起源: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 开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞 + 转发哦!

退出移动版