面试系列:蘑菇街面经

序言

说起来也是一段难忘的经历,就在不久前参加了蘑菇街的秋招,最终倒在了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分钟左右,虽然时间不长但也让我收获了很多吧!

面试总结

通过这次面试可以看出,微服务相关的知识还是很重要的,并且需要对分布式常见的问题有一些解决的思路,
总体的知识广度要求还是挺高的,深度方面也尤为重要,面试官一般会针对一个问题给你发出连环炮,直到你答不上来为止,所以平时在学习的过程中一定不能忽视细节方面,也需要多读读源码,因为源码这一块必是面试加分项,多抽时间对自己所学的知识进行沉淀,把知识变成自己的,终有一天可以“吊打面试官”的哈哈哈。

最后祝愿所有的读者可以找到心仪的工作!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guojunjiang12345

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值