由于没有进行充分的准备,决定先去了解一下当前市场的面试情况,大部分知识都是之前积累的。

行云集团 - 高级 Java 工程师岗位

薪资范围

薪资范围:25K50K,适合35年经验的Java高级开发工程师。

第一轮面试(60分钟)

  1. 项目介绍(20分钟):面试官会深入挖掘你的职责、项目的上下游以及项目架构,询问你是如何进行服务拆分的。
  2. Spring Bean的生命周期:我主要根据自己开发的小框架进行回答,因为该框架拦截了 BeanPostProcessor。因此,在Spring容器启动时会自动检测实现该接口的类,并在调用构造方法前后分别执行 postProcessBeforeInitializationpostProcessAfterInitialization,这一部分我详细讲解了近10分钟。
  3. Spring事务的实现原理
  4. MySQL事务隔离级别
  5. MySQL如何实现事务:重点讨论了undolog日志的工作机制,并提及事务ID。
  6. 当前读与快照读的概念:通过缓存和数据库作比较,说明当前读相当于直接从数据库读取,而快照读则相当于从缓存读取。在RC级别,SQL执行前后会生成快照,而在RR级别中,会在事务开始时生成全局快照,只读该快照部分的后续查询操作。这里还可以进一步讨论唯一索引实际上是当前读的体现。
  7. 为什么MySQL删除了大量数据后文件大小不变:MySQL仅在数据页上删除占位,物理删除会导致数据出现空洞。
  8. 如何恢复MySQL至误删前的状态
  9. 日常工作中SQL的优化:包括深度分页优化、索引优化、联合索引的合理建立、覆盖索引的利用、以及如何避免MySQL的文件排序等。

第二轮面试(60分钟)

  1. 自我介绍
  2. 介绍DDD架构模式:概述领域驱动设计、聚合、聚合根、领域和值对象等概念。
  3. 在项目中你认为属于哪个领域:讨论上下游在项目领域中的状态。这是一个较为抽象的问题,需要从领域职责出发进行阐述。
  4. DDD的优势与劣势:从MVC架构模式进行比较,分析贫血模型与充血模型的优缺点,表明MVC易于理解,而DDD学习成本较高。
  5. 项目中的灰度发布:描述实施的灰度策略、范围、粒度以及实现层面。
  6. 数据库双向同步的实现:为确保新旧功能的数据一致性,简述基于阿里云DTS的实施过程。
  7. RocketMQ与Kafka的区别:简要比较这两种消息队列,指出RocketMQ在实时性和事务性消息支持上的优势。
  8. Kafka的优势及实现原理:讨论批量消息处理、零拷贝技术等。
  9. 双向数据同步中的BinLog监听问题:如何处理消息的幂等性和数据标记。
  10. 遇到的项目问题及亮点:包括服务器线程满载和负载均衡策略等。

本次面试中,基础知识考察较少,更注重项目的细节和实际问题。