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

美团 · 后端开发暑期实习生 · 一面 · 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 中的事务连接,导致子线程的操作实际上脱离了主线程的事务边界,即使抛出异常也无法回滚子线程已执行的操作。