化工行业软件开发Java三面面经(HR+技术官双重拷打)
《面试题目》
一面 HR 初筛
- 介绍一下你最近待过的公司的项目业务是什么?
- 你处理哪些线上问题,请用通俗易懂的语言说清楚?
- 后续的职业规划是什么?
- 请你对自己做一个自我评价。
- 你说你沟通能力强?举个例子说说你的沟通能力有多强。
- 自我驱动力表现在哪些方面?责任心表现在哪些方面?
- 你和其他同等年限经验的人相比,优势在哪方面?
- 上家公司离职的原因是什么?
- AI 工具用过哪些?
二面技术面
- 拷打项目 + 八股。
- 为什么实时行情的处理需要用到 Flink?一定要用吗?
- 项目中用到了分布式事务,说说用的是什么方案。
- 用到了哪一种分布式事务处理方案(Seata 的 XA、AT、TCC 三种模式)?
- XA 是什么?原理是什么?过程是什么?
- 一个事务 commit 提交之后还能回滚吗?
- AT 的原理是什么?
- 在 AT 进行回滚判断时,如果其他事务改动了数据,后镜像岂不是变得不一样?
- TCC 的字母分别是什么意思?
- TCC 和 AT 的区别在哪里?
- 还有哪些分布式事务方案?
- RocketMQ 半事务原理是什么?
- 有 Kafka 了为什么还要用 RocketMQ?
- 假如有多个消息消费者,topic 中的一条消息会被这些消费者都消费,还是只会被其中一个消费?
- 线程同步有哪些方式?
- 信号量为什么要设计为共享锁?共享锁和独占锁的区别?
- 线程池的执行流程?
- 线程的状态有哪些?
- 死锁形成的必要条件?
- MySQL 索引的结构?
- 聚簇索引和二级索引的区别?它们的叶子节点和非叶子节点存储的是什么?
三面 HR
- 个人情况、家庭情况、通勤距离、公司业务。
《参考解析》
1. Seata 三种分布式事务模式对比
- XA:基于数据库原生两阶段提交协议,强一致性但资源锁定时间长、性能差,适合对一致性要求极高的场景。
- AT:Seata 默认模式,业务无感知,框架自动生成回滚日志(before image / after image)实现自动补偿。一阶段提交本地事务并记录前后镜像,二阶段失败时用前镜像回滚。若其他事务在二阶段提交前修改了数据,AT 通过校验当前数据与后镜像是否一致来判断是否可以直接回滚,不一致则需要人工介入,这是 AT 模式脏写防护的关键设计。
- TCC(Try-Confirm-Cancel):需业务方手动编码三个阶段的逻辑,性能最好但开发成本高。核心问题:空回滚(Try 未执行 Cancel 却执行,需要记录事务状态判断)、业务悬挂(Cancel 先于 Try 到达,需拒绝执行)、幂等性。
2. Kafka vs RocketMQ
两者都支持高吞吐消息处理,但 RocketMQ 原生支持事务消息(半事务消息 + 回查机制解决分布式事务)、延迟消息、消息过滤更灵活,且对国内电商级业务场景(如订单超时取消)支持更友好;Kafka 在日志采集、流式计算生态(与 Flink/Spark 集成)上更成熟。同时引入两者通常是历史架构演进或不同团队技术栈选型的结果,并非必须。
3. RocketMQ 消息消费模式
RocketMQ 默认是集群消费模式:同一个 Consumer Group 内,一条消息只会被组内一个消费者实例消费(用于水平扩展、负载均衡);广播模式下消息会被该 Group 内所有消费者实例都消费一次(用于配置广播等场景)。默认是集群消费,这与候选人回答的方向一致。
4. 死锁四个必要条件
互斥条件(资源不能共享)、请求与保持条件(持有资源同时等待新资源)、不可剥夺条件(资源只能主动释放)、环路等待条件(多个进程形成循环等待链)。破坏任一条件即可避免死锁,常见手段是固定加锁顺序破坏环路等待。
5. MySQL 聚簇索引与二级索引
聚簇索引(InnoDB 主键索引)的叶子节点直接存储整行数据,非叶子节点存储主键值与指向下一层的指针;二级索引的叶子节点存储索引列值 + 主键值(而非整行数据),查询时若需要主键之外的列,需要根据主键值再去聚簇索引查一次完整行,即「回表」。覆盖索引可以避免回表,是 SQL 优化的常见手段。