数字马力一面
面试官一上来让我做自己介绍,然后开始问项目,基本都不是简单地问八股,都是融合场景问的,一环扣一环。说是让我顺序介绍项目,但我刚讲完第一个项目,就把这个项目一直问到结束。
因为我的项目用了ElasticSearch,就先让我说一下我是怎么用ElasticSearch的。介绍完之后,看我有用RabbitMQ去更新ElasticSearch,就开始问我RabbitMQ以及业务场景题,比如说现在消息队列里有这么些消息,更新A,更新B,更新C。如何确保在并发的情况下是先更新A再更新B的(假如说B先到了消息队列里面,A因为某些原因慢到了),我一开始想的是直接给消息编号,然后与数据库里的编号比较,如果比它大,说明这个消息的执行优先级是比较后的(不断轮询直到能执行为止)。面试官对这个答案有点不满意,说ElasticSearch里有能实现这个效果的功能(我对ElasticSearch理解还真不多)。事后我查了一下,这个也是RabbitMQ常问的点,就是消息顺序性问题,但是我确实没记住,一般来说就是一个 queue但是对应一个 consumer,然后这个 consumer内部用内存队列做排队,然后分发给底层不同的 worker 来处理。
之后问题就转到RabbitMQ了,问死信队列,延迟队列,由于我很久没看RabbitMQ的知识点,连延迟队列怎么实现的都忘了,然后就疯狂拷打。紧接着又问延迟队列的应用场景(支付订单的倒计时界面),以及还有没有其他可以实现延迟队列的方法,我说redis应该也可以。
提到接着话题顺势到了我的分布式锁,因为我的分布式锁是由Redisson实现的,那么Redisson也是有延迟队列的但是我不知道,他问我redis如何实现延迟队列,我说轮询+检测过期时间,感觉面试官有点被逗笑了,就说Redisson就有延迟队列。说我对所用的中间件或者框架都是只知道个大概,有顺着分布式锁问分布式锁如何续约(Redisson自己有个续约机制),以及还有什么可以做分布式锁(我答数据库),接着问我是项目里怎么上分布式锁。我说是写了两个注解,用AOP来调用Redisson处理,接着又问我注解怎么写的,我说有Lock和Key两个注解,Lock就是对方法上锁,Key就是提供上锁的参数。它又说我的锁的颗粒度有点大了,锁的是整个方法,突然问我知道SpEL吗。我说知道一丢丢,因为我的Key就是这么写的(expr = "#{userId + '::' + bookId}"),顺着又往下问,说你没用过Mybatis吗,用过Mybatis的话SpEL怎么只会一点点。我说我都用basemapper的,很少手写xml了。
中间还问了我xxljob的优点什么什么的,这里不展开说了。
扯了一大堆最后问我SpringBoot相关的,问我经常用什么注解,知道三级缓存(循环依赖)不,这部分我总算能答上来了,自此面试结束。我能回忆起来的点我基本都说了,面试官人还是挺好的,就是问的太有针对性了,我一个小菜鸡还真招架不住,他一直和我说使用技术前要对技术进行调研,不能浅尝辄止,并且不要死背八股文,要懂得结合应用场景阐述你对这个技术的理解。虽然感觉一面要凉了,不过收获还是挺多的。
#24届软开秋招面试经验大赏#