连连支付Java后端实习生二面
自我介绍+项目介绍:5分钟
第一个项目的话你们有几个人在开发呢?2个前端和2个后端。
前后端的交互是用什么方式去交互呢?基于RESTful规范前端使用Axios来发送请求。
你能说一下你们的前端请求去访问后端的一个基本流程?(不知道是要说那一套URL的八股文还是指的是我们这个项目)从计算机网络开始讲起直到我们项目里的Gateway进行分发。
有了解过具体的分发逻辑吗?底层实现没有去看。
对Spring原生的分发机制有了解吗?Servlet那一套吗?
是的,你了解多少呢?只会使用,不太了解原理。
Spring的底层代码有看过吗?没有看,了解过是百万级的一个代码,但是对其中个别的部分有去看过,比如Bean的生命周期,三级缓存等等。
那你刚刚说到装配和生命周期你能说一说是怎么做的吗?吟诵经典的八股文然后提到一些函数名显得专业一点。
那现在有一个普通的类,我想把他变成Bean,有什么办法呢?注解、XML、Config,Spring提供的application对象进行设置等等。
那还有其他的方式去引入吗,比如有一个类是在别的包里面,然后为我们不可能在他的代码里面去进行修改,有没有办法能够让它在刚启动或者刚运行的时候把它变成Bean呢?不太清楚。
Spring提供了很多钩子接口,你有了解吗?不太清楚。
看你说到有用到Redis配合Spring的注解去实现缓存,你说一下这个的使用场景吧?读多写少。
有去测试过MySQL的它能够承载的一个量吗?我记得连接数是有一个配置的,最大是16384。
就是假设你现在不使用Redis而是仅仅使用MySQL会有什么问题吗?增加服务器的一个查询压力。
MySQL同一时间能接收多少并发有了解过吗?不太清楚。
你这边用到了@Cacheable的,你能说一下他的底层实现原理吗?本质上是AOP,在代码前后进行缓存的一个判断,判断缓存中是否有,如果有的话那么就返回没有的话那么就继续查询之后再更新。
那它是怎么切到这个点的呢?不太懂,开始乱说。
比如说我现在加缓存失败了,或者没有查到那么进行什么处理?进行数据库的查询。
有看过它的源码吗?没有看过。
如果让你自己去实现这样的一个注解,你会怎么实现?模拟AOP,通过动态代理的方式,获取此时的参数然后判断缓存里面是否有然后如果有的话就返回,没有的话就去查询数据库。
对设计模式这一块有了解过吗?略有了解,比如单例模式、享元模式和装饰器模式,详细讲解了一下这些设计模式。
有实际去用过这些模式吗?单例模式是用的最多的,然后以前自己设计JDBC连接池的时候用过享元模式。
你们刚才用了Redis嘛,然后Redis和数据库的这个一致性是怎么保证的?延迟双删。
具体怎么实现的呢?删完之后让线程休眠之后再删一次。
为什么再删一次的?这部分不太清楚了。
MySQL你们都在用,如果现在有一条查询语句如果查询的很慢,那你会怎么分析?用explain操作看。
具体你会去看哪些参数呢?检查行数,然后索引类型,扩展参数里面是否有fileSort或者其他的一些状态,因为优化器做的一些操作可能并不是我们想要的。
假如现在有三个参数a,c现在要select * from t where a="" and c="",主键是一个id,让你去设计一个索引你会怎么设计呢?利用联合索引所带来的索引覆盖方式来避免需要不断进行回表,所以可以使用ac的联合索引。
那因为我使用的是select *嘛所以可以不回表吗?不可以的,因为加了索引之后是二级索引,存储的还是聚簇索引里面的id字段,所以还需要回表才能得到数据。
对MySQL的事务这一块有了解吗?有的,比如不同的隔离级别,不同的存在问题以及不同的解决方案。
MySQL的隔离是怎么去实现的呢?聊了聊MVCC。
事务id除了在undo_log里面存储,还有什么地方会存储吗?不太清楚了。
undo_log和bin_log和redo_log之间有什么区别呢?经典八股,背一下就好了。
你们有做过完整的项目吗?简历上的两个都是这样的。
项目之后有发布上线吗?比赛期间上线了之后就下线了。
有了解过这方面的知识吗?打包之后部署和启动,运用过基于tmux的操作,也了解过docker方式的运行。
对docker了解吗?用过吧,拉取镜像源之后利用容器的思想来运行服务,可以将不同的服务运行在同一个主机上。
你们的项目是单机部署的还是分布式呢?一个是单机的一个是分布式。
对分布式和中间件这块有什么了解吗,比如一些分布式问题和场景?从项目的号源超卖问题引入分布式锁。
这样会不会带来效率问题?MySQL数据库不会受到影响,而且它阻塞的是服务器的请求。
如果我需要在很短的时间内把这些请求都处理了呢?里面CAS操作来做。
怎么做呢?给表加个版本号字段来操作。
有没有更简单的方式,就是版本号也不加了,可不可以利用现有的字段?想不太出来了。
那比如说我现在利用了一些中间件,然后是分布式部署的,他有很多台服务器,然后有一台挂掉了,那么会怎么处理?主从复制或者切片集群->哨兵集群,这里我讲的非常非常详细。
那如果说这个过程中主从库还没有同步完成,主库就挂了那么会丢数据吗?Redis的话首先在主库没有挂的时候主库就有一个缓冲区来记录他们主从同步的一个进度,这也是哨兵择主的一个很重要的因素,然后呢就是Redis本身也提供了持久化机制进行全量复制。
持久化的机制有哪些机制呢?AOF->频率->重写机制;RDB->全量快照->写时复制,两个都详细地讲了讲。
你刚刚说到他会用哨兵,那么哨兵挂了怎么办?哨兵的话其实也是有集群的嘛,所以可以配置多一点哨兵。
Redis的Cluster和哨兵有什么区别呢?没有了解。
你对未来自己的职业规划是怎么样呢?
我建议你去了解一下DDD?
反问环节:经典问他哪里需要学习?沟通和基础都很不错,但是很多底层原理可以再去学习一下。
PS:我觉得我很多地方回答的还是挺差的,面试官也没有DISS,其实蛮好的。
第二天早上HR说OC了,挺意外的,拿到了第一个offer。
#java##后端##实习#