一位球友的 2022 年跳槽面试经历,高级 Java 工程师岗位,希望对你有帮助。
下面是正文。
由于没怎么准备,先去市场看看现在的面试行情,大部分知识都是以前积累的
行云集团-高级 Java 工程师岗位
薪资范围: 25k~50k ,3~5年经验 Java 高级开发工程师
一面(60min)
- 介绍项目(20min):面试官往死里抠你的职责,项目上下游,项目架构,你如何做的服务拆分?
- Spring Bean 的生命周期?这部分我主要根据自己写的一个小框架回答了,因为这个小框架拦截了
BeanPostProcessor
,所以在 Spring 容器在启动的时候会自动检测是否有类实现该接口,在调用类的构造方法之前,会执行postProcessBeforeInitialization
调用构造方法之后执行postProcessAfterInitialization
,主要这么回答的, 巴拉巴拉讲了快 10 分钟。 - Spring 事务的实现原理?
- MySQL 事务隔离级别?
- MySQL 如何实现事务的?主要 undolog 日志是怎么工作的, 拿事务 id 回答
- 当前读与快照读是什么?用缓存和数据库举例子,当前读相当于直接读库,快照度相当于直接读缓存。RC 级别在执行 SQL 前后生成快照。RR 级别在开启事务生成全局快照后续的查询操作只读快照部分,这里还可以扩展,唯一索引其实是当前读。
- 为什么 MySQL 表删除了一堆数据,但是文件大小不变?MySQL 对于删除的数据,仅仅只是删除占位,被删除的数据仅缺失了之前数据页的占位。物理删除会造成数据空洞。
- MySQL 如何恢复到误删前的状态?
- 你在日常工作中对 SQL 进行了什么优化?巴拉巴拉,深度分页的优化、索引的优化、建立合适的联合索引,利用覆盖索引或者索引下推这块牵扯的太多了,就稍微答了一些,这块还可以扩展,例如:针对索引区分度建立联合索引,尽量保持区分度高的在最左。联合查询的时候,关联字段都需要加上索引。有排序场景,尽量不查询 text,Blog 字段,合理利用内存排序,避免 MySQL 的文件排序 这里扩展一下就是,MySQL 有一个叫做 sort_buffer,对这里优化才是关键。
部分问题参考答案 :
- Spring常见问题总结
- 【技术干货】Spring事务原理一探
- MySQL知识点&面试题总结
- MySQL三大日志(binlog、redo log和undo log)详解
- 那些年我们一起优化的SQL - 有赞技术团队
二面 (60min)
- 自我介绍
- 看你熟悉 DDD 架构模式,介绍一下?大致介绍一下领域驱动设计,概念,聚合,聚合根,领域,值对象等等
- 你认为在你做的项目场景中属于哪一个域?上下游分别会以什么状态进入你当前项目的领域?问的太抽象了,从要从领域职责进行划分来回答,什么职责对应什么域,上游域对象存在的状态当前领域对象职责,太抽象了问题。
- 你认为 DDD 的优势和劣势?主要从 MVC 架构模式对比,从面向对象角度出发,贫血模型与充血模型的优缺点。MVC 更容易理解,DDD 更难理解,学习成本较高。
- 看你项目中做了灰度发布?介绍一下你是怎么做的?这个要从实际项目场景出发了,灰度策略,灰度的范围、粒度,哪个层面实现的。
- 看你在灰度的时候还做了数据库双向同步?介绍一下?因为新功能和老功能都要用的啊, 并且 2 套系统都是要用的,数据如果不一致,就会造成问题。基于阿里云 DTS 做的。
- 你说 DTS 从 RocketMQ 变为了 Kafka, 你说说 2 个消息队列的区别?这块可能答的不太行,RocketMQ 本质就是基于 Kafka 来做的,但是实时性会比 Kafka 好,并且支持事务性消息,但是 Kafka 也可以有特殊的方法支持事务消息。
- Kafka 的优势在哪里?实现原理是什么?批消息处理,零拷贝技术,网络接口层-用户态-内核态,缩短拷贝链路。
- 双向数据同步会涉及 BinLog 监听,可能造成消息来回弹,你怎么处理的?幂等,数据标记。
- 你在项目中碰到过的问题?有什么亮点?服务器线程打满,负载均衡策略。
本次面经基础基本考察的不多,项目扣的很细,项目中的问题点也会仔细扣。
部分问题参考答案 :