序言
说起来也是一段难忘的经历,就在不久前参加了蘑菇街的秋招,最终倒在了2面。。。
自己也收获了许多最终决定将这次经历分享给大家,在这儿求个赞!(#.#)
投递简历
简历真的是非常重要的,它就相当于我们的敲门砖,首先自己得有足够的项目经验,再者找一个好模板也非常重要。我在写简历的时候也参考了很多github上的简历。
https://github.com/apachecn/Interview
(附上一个链接)
我是通过朋友内推的方式投递到的蘑菇街,一个星期后收到了一面的邀请。。。
一面
当时正在教室上课,面试官突然说第二天有事,要提前一天面试,于是我赶忙找了个空闲的办公室,蘑菇街面试的方式是通过QQ视屏面试的,这也是我第一次视屏面试,体验还不错,看到面试官后,紧张的心突然不紧张了。(可能是面试官长得比较亲切吧)
第一个环节就是自我介绍了,这个环节要尽量精简,不宜占用太长的时间,尽量说一些简历上没有的内容。
-
面试官:说一下SpringBoot和Spring的区别:
-
我:SpringBoot其实是让我们更方便使用Spring的框架,然后说了下SpringBoot自动配置的原理和起步依赖
-
面试官:说一下SpringCloud的常用组件
-
我:主要说了一下常用的5大组件(注册中心,配置中心,网关,负载均衡远程调用,熔断器),还有Alibaba开源的一些组件。
然后面试官又问了一些注册中心的实现原理和常见的负载均衡算法,主要问了一下权重负载的实现
(可以看出分布式框架的重要性!上来就直接怼了目前主流的SpringBoot和SpringCloud) -
面试官:说一下Mybatis的执行流程和底层实现
-
我:这个回答的还算可以,因为之前有自己写过一个简易的Mybatis
(面试底层真的很重要,光会用还不行,平时没事得多看看源码)
接下来就是直接怼项目了,我自己做过4、5个项目,由于蘑菇街是个电商公司,所以我就选择了一个电商项目。
Redis在项目中的使用
-
面试官:说一下项目如何承载高并发访问
-
我:nginx负载均衡+用redis做缓存+异步的处理方式
-
面试官:说一下redis在项目中的使用
-
我:主要做一些热点key的缓存,购物车的缓存还有JWT令牌的存放
-
面试官:说一下redis可能存在的问题
-
我:说了一下redis缓存雪崩,穿透,击穿的场景和对应的解决方案
具体的解决方案可以看我的另一篇文章:深入浅出redis(我也是一个菜鸟,有写错的地方还请看客指出)
-
面试官:说一下缓存一致性的问题
-
我:延时双删策略(当时只会这一种性能不高的策略。。。)
-
面试官:说一下redis会不会丢失数据
-
我:说了下RDB和AOF的持久化机制
秒杀模块
- 面试官:说一下秒杀的实现
- 我:我说了一下在项目中秒杀的实现
商家填写秒杀商品,管理员同意,定时脚本将秒杀商品的信息存放到redis当中。
用户秒杀商品,首先会对用户的排队次数做校验,如果该用户正在排队秒杀该商品则直接返回(不允许用户重复秒杀同一商品,害怕一些人作弊!)
然后将用户秒杀的信息封装起来,发送一条MQ消息,接收方接收后异步的进行处理(为了提高并发量)
接收方,接收到消息后主要做一些参数的校验,然后生成预订单,扣减库存(这里需要通过分布式锁来防止出现超卖的情况),然后保存订单的信息,修改用户秒杀的状态。
最后发送一条延时消息(RocketMQ自带,RabbitMQ需要通过过期消息+死信队列来实现),来判断用户的付款状态,如果在指定时间内还没有付款的话,就将订单设为失效订单,然后做一些数据的补偿。
面试官问了一些优化方面的问题,也提出了一些可能会出现的问题
优化:
可以通过在nginx的openresty配置一段脚本,请求达到nginx后直接查看库存是否足够,不足够的话直接返回。
提前对秒杀的URL进行编码,防止被别人提前知道秒杀的地址,从而通过作弊的手段进行秒杀。
做一些限流的保护
多个系统之间的调用
- 面试官:说一下多个系统之间的调用方式和可能会出现的问题
通过openFeign来进行远程调用,然后做一些熔断的保护防止雪崩的情况。
多个系统调用涉及到的分布式事务问题。
(解决方案在我另一篇文章:分布式事务的解决方案)
结束语
- 面试官:你有什么问题想要问我吗?
- 我:主要问了一些公司使用的架构(他们内部使用的是自研的框架),还偷偷问了下面试结果(这次面试自我感觉挺好的,就问了一下)面试官说让我好好准备二面。
PS:一面愉快结束,总耗时50分钟,面试完心情还是十分的激动。
二面
一面过了1天就收到了二面的邀请,不过二面的时间是定在了一个星期之后,时间点也很尴尬,正好是下午的2.30,这个时间点正是刚午休完,脑袋晕晕的。
经过漫长的等待,终于等到了二面那一天(一面的面试官是提前几天加我QQ的,但二面的面试官是在2.29分才加的,当时心里就感觉“来者不善”,应该是个“狠角色”)
拨通视频,看到面试官的第一眼就感觉和一面的面试官感觉不一样,二面的面试官看起来就是很严肃的,高高的发际线和一副黑框眼镜!然后说了一下这次面试时间大概在30分钟左右,所以当时心里特别的紧张(最后经过了解这位面试官正是我要面试的部门的leader)
- 面试官:上来直接就让我讲项目了
- 我:介绍了一下项目(和一面介绍差不多)
- 面试官:请讲一下面试过程中遇到的最大困难
- 我:一开始听到这个问题有点蒙蔽,脑子里不停想着自己当时碰到的坑,最后说了一下配置方面包扫描的问题,编码方面说了一下雪崩的问题
- 面试官:这个项目是在本地么?还是已经部署了?
- 我:这个问题直击我的弱势,因为之前我总认为部署是运维需要做的事,自己就没有实践的部署过项目,包括一些测试,也是本地用jmeter压测的。(这个问题应该是减分最大的,也就直接导致了我的二面失败,结束面试后我就痛定思痛,改变了这一思想然后自己部署了一下)
- 面试官:说一下限流的常见算法
- 我:说了一下漏桶算法,令牌桶算法和滑动窗口算法。(大概是回答出来了,但有一些细节方面的问题没有回答的很好)
- 面试官:这个项目有什么亮点?
- 我:这个问题也让我蒙蔽了,在思索过后就说了一下秒杀模块。。。
- 面试官:你有什么问题想问我的吗?
- 我:我就让面试官说了一下我的不足,面试官给我说了一下真正的开发不仅仅是编码方面的开发,还包括后期的部署,维护等方面。
PS:二面持续了30分钟左右,虽然时间不长但也让我收获了很多吧!
面试总结
通过这次面试可以看出,微服务相关的知识还是很重要的,并且需要对分布式常见的问题有一些解决的思路,
总体的知识广度要求还是挺高的,深度方面也尤为重要,面试官一般会针对一个问题给你发出连环炮,直到你答不上来为止,所以平时在学习的过程中一定不能忽视细节方面,也需要多读读源码,因为源码这一块必是面试加分项,多抽时间对自己所学的知识进行沉淀,把知识变成自己的,终有一天可以“吊打面试官”的哈哈哈。
最后祝愿所有的读者可以找到心仪的工作!