消息队列面试都怎么问?

Posted 码农沉思录

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了消息队列面试都怎么问?相关的知识,希望对你有一定的参考价值。

点击关注“ 码农沉思录
 发现更多精彩
前言

消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在 消息队列的使用和原理方面对小伙伴们进行360°的刁难。
作为一个在互联网公司面一次拿一次Offer的面霸,打败了无数竞争对手,每次都只能看到无数落寞的身影失望的离开,略感愧疚( 请允许我使用一下夸张的修辞手法)。
于是在一个寂寞难耐的夜晚, 暖男我痛定思痛,决定开始写 《吊打面试官》系列,希望能帮助各位读者以后面试势如破竹,对面试官进行360°的反击,吊打问你的面试官,让一同面试的同僚瞠目结舌,疯狂收割大厂Offer!

絮叨

这期本来是准备大家投票出来的哈,然后在 Java基础和 消息队列选一个写的,但是我一想,Java基础光是集合每种集合我都可以写好几篇了,基础都得写几个月了,那是不是可以先把短的这个消息队列写了?
我脑子 灵光一闪,拍了下桌子,那就这么决定了吧!
所以就有这期了哈哈。
重要!在开始之前我想问一下,大家是喜欢我直接怼知识点用自己的语言组织的方式讲,还是这样面试场景的方式讲?
因为我发现一个很严肃的问题,我的开场和结尾要是几百篇都差不多,最后你们会不会厌倦呀?
总之这个建议对我很有用,或者你有什么写作的建议都可以加我微信 悄悄跟我说。

面试开始

一个风度翩翩,穿着格子衬衣的中年男子,拿着一个满是划痕的mac向你走来,看着铮亮的头,心想着肯定是尼玛顶级架构师吧!但是我们看过暖男敖丙的系列,腹有诗书气自华,虚都不虚。

小伙子之前问了你这么多Redis的知识,你不仅对答如流,你还能把各自场景的解决方案,优缺点说得这么流畅,说你是不是看过敖丙写的《吊打面试官》系列呀?

惊!!!老师你怎么知道的,我看了他的系列根本停不下来啊。

呵呵,Redis没难住你,但是我问个新的技术栈我还怕难不住你?我问问你你项目中用过消息队列么?你为啥用消息队列?

噗此,这也叫问题?别人用了我能不用么?别人用了我就用了呗,我就是为了用而用。
你心里嘀咕就好了,千万别说出来哈,说出来了没拿到Offer别到时候就在那说,敖丙那个渣男教我说的!
消息队列面试都怎么问?
面试官你好:我们公司本身的业务体量很小,所以直接 单机一把梭啥都能搞定了,但是后面业务体量不断扩大,采用 微服务的设计思想, 分布式的部署方式,所以拆分了很多的服务,随着体量的增加以及业务场景越来越复杂了,很多场景单机的技术栈和中间件以及不够用了,而且对系统的友好性也下降了,最后做了很多技术选型的工作,我们决定引入 消息队列中间件。

哦?你说到业务场景越来越复杂,你那说一下你都在什么场景用到了消息队列?

嗯,我从三个方面去说一下我使用的场景吧。
Tip:这三个场景也是消息队列的经典场景,大家基本上要烂熟于心那种,就是一说到消息队列你脑子就要想到 异步、削峰、解耦,条件反射那种。

异步:

我们之前的场景里面有很多步骤都是在一个流程里面需要做完的,就比如说我的下单系统吧,本来我们业务简单,下单了付了钱就好了,流程就走完了。
但是后面来了个产品经理,搞了个 优惠券系统,OK问题不大,流程里面多100ms去扣减优惠券。
后来产品经理灵光一闪说我们可以搞个 积分系统啊,也行吧,流程里面多了200ms去增减积分。
再后来后来隔壁的产品老王说:下单成功后我们要给用户发短信,也将就吧,100ms去发个短信。
再后来。。。(敖丙你有完没完!!!)
消息队列面试都怎么问?
反正就流程有点像这样 ↓
消息队列面试都怎么问?
你们可以看到这才加了三个,我可以 斩钉截铁的告诉你真正的下单流程涉及的系统绝对在10个以上(主流电商),越大的越多。
这个链路这样下去, 时间长得一批,用户发现我买个东西你特么要花几十秒,垃圾电商我不在你这里买了,不过要是都像 并夕夕这么便宜, 真香!
但是我们公司没有夕夕的那个经济实力啊,那只能优化系统了。
Tip:我之前在的电商老东家要求所有接口的 Rt( ResponseTime响应时间)在200ms内,超出的全部优化,我现在所负责的系统QPS也是 9W+就是抖动一下 网络集群都可能炸锅那种, RT基本上都要求在50ms以内。
消息队列面试都怎么问?
大家感受一下这个QPS。

嗯不错,链路长了就慢了,那你怎么解决的?

那链路长了就慢了,但是我们发现上面的流程其实可以 同时做的呀,你支付成功后,我去校验优惠券的同时我可以去增减积分啊,还可以同时发个短信啊。
那正常的流程我们是没办法实现的呀,怎么办, 异步。
你对比一下是不是发现,这样子最多只用100毫秒用户知道下单成功了,至于短信你迟几秒发给他他根本不在意是吧。
消息队列面试都怎么问?

小伙子我打断你一下,你说了异步,那我用线程,线程池去做不是一样的么?

诶呀,面试官你 不要急嘛,我后面还会说到的,骚等。

解耦:

既然面试官这么问了,我就说一下为啥我们不能用线程去做,因为用线程去做,你是不是要写代码?
你一个订单流程,你扣积分,扣优惠券,发短信,扣库存。。。等等这么多业务要调用这么多的接口, 每次加一个你要调用一个接口然后还要重新发布系统,写一次两次还好,写多了你就说:老子不干了!
而且真的全部都写在一起的话,不单单是耦合这一个问题,你出问题排查也麻烦,流程里面随便一个地方出问题搞不好会影响到其他的点,小伙伴说我每个流程都 try catch不就行了,相信我别这么做,这样的代码就像个 定时炸弹

以上是关于消息队列面试都怎么问?的主要内容,如果未能解决你的问题,请参考以下文章

字节跳动面试官:为什么要用消息队列?你项目中是怎么用的?

每日一题:消息队列面试常问题目

消息队列经典十连问

消息队列经典十连问,你能扛到第几问?

Java面试题:引入消息队列后如何保证其高可用性?

消息队列的面试题6