2024/1/13 面试
-------------上来先自我介绍--------------
我简历上写了三个项目:
- 给研究所做的项目,改的 vscode 源码和开发 vscode 插件完成的
- 跟着网上做的铁路购票系统(面试官只问了这个项目)
- 科研项目,做的计算机视觉
-------------面试官提问-----------------
- 购票系统中在算法层面怎么分配座位的,1、2、3等多个人购买怎么分配座位?
我:如果一个人的话就哪里有空位哪里插入
面试官:这样的话会导致什么问题
我:会导致座位分配碎片化,但是我的确是这么做的,当时没考虑太多。
面试官:那2、3多人呢
我:两个人的话就有相邻的空位就分配相邻的空位,没有的话就分配同一车厢离得近的座位,不同车厢就分配离得近的车厢。三个人也是这样。
面试官:三个人多人也是这样?
我:我目前是这么考虑的。没有想更复杂的情况。
面试官:你说的是流程方面的?算法方面呢?
我:就是简单的实现了一下。 - 购票系统的登陆怎么完成的?
其实这个我不太懂。
我:用的 SpringSecurity ,第一次登陆要先查询数据库,然后把数据存储到 token 中,之后再访问的话就不需要再查询数据库了,因为查数据库很重嘛
面试官:那用 token 存储会不会不安全?
我:理论上是有可能不安全的,因为 token 是保存在浏览器缓存中的,是有可能不安全的。
面试官:那传输过程会不会被截取?
我:这个我还真不了解,我下次去再看看。 - 购票系统为什么要用消息队列?
我:先不说消息队列的削峰、异步、解耦这些功能,我在项目里使用消息队列还利用了消息队列的保证消息不丢失的功能,这样的话就能保证在删除缓存的时候一定能够删除成功,至于为什么使用 rokcetmq 是因为项目中还用了延迟消息来延迟订单关闭,kafka 的话,这些功能需要自己去封装,所以使用了 rocketmq。
面试官:你说消息队列能保证删除缓存一定成功,那万一消息漏读了怎么办?
我:消费者没有消费成功是会重试的,而且只有消费成功了才会返回 ack
面试官:是不是有一个消费函数指定至少发送一次之类的?(想让我说 rocketmq 的 At Least Once 这次词?其实我大概意思已经差不多了吧?)
我:是有这个是有这个。 - 购票系统这个令牌限流是什么?
我:令牌就是拿到令牌的请求才能再去拿分布式锁,这样的话就防止了大量的请求都去请求分布式锁,减轻了压力;令牌的数量等于票的数量,这样也可以防止超卖。
面试官:那我不卖这么多票不行么?有1000张票,我只让卖100张,不是一样?
我:(我觉得他说的有道理)您说的有道理,我觉得是差不多的。
------------做题-------------
题如图所示 easy 题,先让我说思路,我说了一个 nlgn 的思路,然后他说还有更简单的,也没让我做,就结束了。凉凉。