面灵AI→

美团后端开发暑期实习一面面经(第六次面试)

轮次
一面
时间
2026-05
来源
牛客网

《面试题目》

  1. 本硕都是网络安全方向,为什么想转 Java 开发?
  2. 工作流平台主要能解决什么问题?
  3. DAG 是什么?为什么要进行 DAG 检测?
  4. 策略模式和模板方法在项目中是如何应用的?
  5. Agent 有哪些特点?如果把现有工作流项目改造为 Agent,应该做哪些改动?
  6. 优惠券的超发和重复领取问题是如何解决的?
  7. 批量发券过程中延迟队列起到什么作用?
  8. 布隆过滤器和模板预热分别用来解决什么问题?数据量很大时,布隆过滤器要做哪些调整?
  9. Spring 的事务注解原理是什么?多线程环境下事务注解可能会失效,具体原理是什么?
  10. 分库分表的分片键是如何选择的?如何避免读扩散?
  11. SQL 题:给定任务 id、主键 id、日志内容,查看每个任务的相关记录

《参考解析》

  1. 优惠券防超发/防重复领取:防超发通常用 Redis 的原子操作(DECR 预扣库存 + Lua 脚本保证”判断库存是否充足+扣减”的原子性),并结合数据库层面的库存字段配合乐观锁(版本号或 WHERE stock > 0)兜底;防重复领取则是在用户维度加唯一约束(如 Redis SETNX 记录”用户+活动”维度的领取标记,或数据库唯一索引),确保同一用户同一活动只能成功领取一次。
  2. 布隆过滤器在大数据量下的调整:布隆过滤器的误判率取决于位数组大小 m、哈希函数个数 k 和元素数量 n 的关系,数据量增大时若不扩容,误判率会显著上升;解决思路一是提前根据预估数据量和可接受误判率计算合适的 m 和 k;二是采用可扩展的分层布隆过滤器(Scalable Bloom Filter),随着数据增长动态新增新的过滤器层。
  3. Spring 事务注解在多线程下失效的原因:@Transactional 基于 AOP 动态代理实现,事务上下文(Connection)通过 ThreadLocal 绑定在当前线程;如果业务逻辑另起子线程执行数据库操作,子线程无法拿到主线程 ThreadLocal 中的事务连接,导致子线程的操作实际上脱离了主线程的事务边界,即使抛出异常也无法回滚子线程已执行的操作。