2023-12-25
#面试#
分享一个我今天找的一个实习的面试
面试官:你先做个自我介绍吧
我:我叫xx,现在就读于xx大学大三,专业是xxx,学校有教授部分编程相关的知识,然后主要是自学的。
问:如果我有好几个系统,比如订单系统,支付系统,为了保证数据的一致性,你有了解过或者思考过吗
答:我了解阿里开发的一个分布式事务Seata框架,他允许弱状态并保证了最终一致性
事后补充:在这我想说CAP原则和BASE理论的,但我一时间忘了BASE理论这几个字就没说
继续问:Seata框架也并不全是最终一致的,它分为几个模式,这一块你知道吗
答:它分为四个模式:XA模式、AT模式、TCC模式,还有一个使用场景不多,没记住
问:你项目中的限流的策略是什么
答:我项目中的限流是使用Redisson来实现的,使用的是令牌桶算法
问:redis实现分布式锁有了解过吗
答:这个不了解,但根据Seata的实现原理可以通过保存一个xid来实现类似的效果
问:mq的常用场景
答:主要是来实现一个异步化
面试官补充:除了实现异步化以外,mq还能实现解耦、多系统间通信还有对突刺流量削峰填谷的作用
问:redis的常用场景
答:限流,缓存,因为redis将数据保存在内存中,读写效率很高,因此还可以用于秒杀场景,但秒杀这一块的具体实现我就不太清楚了
问:在使用Mybatis接收参数时候使用的是#{}还是${}
答:主要是用#{},这样在执行的时候它会先预编译成一条用?占位的sql,然后将参数传进去,效率较高。一些特殊情况需要使用${},但这样是直接拼接的sql,有sql注入的风险
问:如果我有一个需求需要查100条数据,但我每次只能查到20条,有什么效率高的方法
答:在这里可以使用多线程来解决,根据阿里的编码规范,使用多线程必须经过线程池,所以可以创建一个线程池来完成这个需求,因为是查询数据库操作,因此这是一个IO密集型线程池,因为这个需求最少得执行五次,所以可以设置线程池的初始线程数为5
继续问:如何接受线程的返回值呢
内心PS:我不会啊,我没遇到过需要返回值的情况
面试官给我的回答我也忘了
问:nginx有使用过吗
答:有,我的前端部署在nginx,用它解决的跨域
接着问:是在请求头里添加了什么吗
答:不是,是将前端指定路径的请求转发到了后端
然后这里面试官就跟我好好说了说
问:在设计数据库的时候有什么考虑
答:我这个项目的数据库结构比较简单,在建表时尽量避免使用外键,添加了外键可能导致后端代码中的处理比较麻烦,建好表之后在常用字段上添加索引
问:如果我要查多个字段,建立索引有什么考虑
答:索引的使用有一个最左匹配原则,就是它只有先走了左边的索引才会走右边的索引,所以必填的索引放左边,其他的放右边
继续问:是使用聚集索引吗
答:是的
问:比如我有一个扣费接口,因为某种错误可能会执行多次,请问在设计接口的时候应该有哪些考虑
答:应该考虑幂等性问题,执行一次或多次的最终结果应该保持一致
问:分布式系统生成唯一id有哪些方法
答:我了解到的有一个雪花算法
面试官:好的,那我们今天就先问到这里。
22
0
分享
操作
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
