项目场景面试题精选
Java 后端真实面试专题 · 项目场景篇 ⭐
这一篇最能拉开差距——全是真实面试里追问项目的场景题,背八股的人到这里就露馅。 每题三段:① 怎么答(完整设计思路)→ ② 面试官会怎么追问 → ③ 怎么落到你自己的项目讲。 把这一篇吃透,你讲项目时追问不倒。
年限标签:
🟢 3年内🔴 3年+
1. 🟢 简单介绍一下你的项目和你负责的模块。(几乎必问)
怎么答:四步结构——① 业务背景(项目解决什么问题、给谁用)→ ② 整体架构和技术栈(一句话带过)→ ③ 你负责的模块(重点展开,体现你的贡献)→ ④ 一个有深度的难点(埋钩子等追问)。控制在 2 分钟内,别流水账报技术名词。
追问:你这个模块的核心流程是什么?遇到最难的点?为什么这么设计、有没有别的方案?
往项目引 ⭐:准备一个"主项目"反复打磨到能往深里讲三层。比如电商交易系统:背景是搭交易链路,你负责订单和库存,难点是高并发下单防超卖——这样面试官一定顺着库存往下追,而你早准备好了一整套答案。面试 70% 的时间在聊项目,这道题决定基调。
2. 🟢 高并发下商品库存扣减怎么做,怎么防超卖?(真实高频)
怎么答:先讲扣减时机(下单预扣 or 支付扣,各有取舍),再讲防超卖方案三选一/组合:
- 数据库乐观锁:
update stock set stock=stock-1 where id=? and stock>0,影响行数为 0 说明卖光。适合并发不极端。 - Redis 预扣减 + Lua 原子:高并发秒杀用,先在 Redis 扣、异步落库。
- 悲观锁/分布式锁:强一致但性能差,少用。
追问:Redis 扣了但 DB 落库失败怎么对账?取消订单库存怎么回滚?超卖了怎么补救?预扣的库存怎么释放?
往项目引 ⭐:"我项目秒杀用 Redis Lua 预扣 + MQ 异步落库,普通商品下单用数据库乐观锁。能讲清'为什么秒杀用 Redis、普通用 DB'——按并发量选方案,还能答上'未支付订单超时后用延迟消息回滚预扣库存',这一整套才是面试官想要的深度。"
3. 🟢 为什么 ES 和 MySQL 一起用?数据怎么同步?会给 MySQL 加压吗?(真实高频)
怎么答:分工——MySQL 管事务和强一致(下单、改库存),ES 管全文检索和复杂多条件聚合(商品搜索、筛选、排序)。同步方式——canal 监听 MySQL binlog 实时同步、或业务双写,再加定时任务对账兜底。加压问题——同步走 MQ 异步削峰,时效要求不高,所以不会直接压垮 MySQL。
追问:同步延迟导致搜不到新商品怎么办?同步失败怎么补偿?双写一致性怎么保证?ES 的数据结构怎么设计(拆几个索引)?
往项目引 ⭐:"我项目商品搜索走 ES,用 canal 监听 binlog 同步、定时任务对账兜底。被追问'会不会给 MySQL 加压'时我答:同步经过 MQ 异步削峰、时效不敏感所以扛得住——这正是真实面试里被一路追到的点,能答到这层就稳了。"
4. 🟢 订单/商品状态怎么设计?并发改状态、异常脏数据怎么处理?
怎么答:用状态机——枚举定义所有状态、明确合法流转路径(待支付→已支付→已发货→已完成),禁止跨状态乱改。并发改状态用乐观锁:update set status=新 where id=? and status=旧,防止"同时支付和取消"把状态改乱。异常脏数据走补偿:人工干预 / 定时校正 / 状态回滚。
追问:同时来"支付成功"和"超时取消"两个请求怎么办?状态流转怎么保证不被绕过?
往项目引 ⭐:"我项目订单状态用枚举 + 流转校验,改状态时带原状态做乐观锁 where status=?——'已取消'的订单即使支付回调来了也改不成'已支付',因为原状态对不上。这就是状态机 + 乐观锁解决并发状态问题。"
5. 🔴 评论/审核这类业务怎么异步解耦?怎么保证可靠性?(真实场景)
怎么答:用户提交后先做基本校验 + 幂等判断,然后发 MQ 异步处理(审核→入库→统计),因为时效不敏感、能削峰解耦。可靠性四层:生产端确认机制 + Broker 持久化 + 消费端手动 ack + 失败重试 + 死信队列兜底 + 定时任务补偿。
追问:消息丢了怎么办?重复消费怎么办(幂等)?审核失败的数据怎么处理?MQ 消费速度跟不上 DB 写入怎么办(限流/背压)?
往项目引 ⭐:"我项目'好差评'模块就是评论→MQ→审核→入库→统计这条异步链。被追问可靠性时我能讲全'生产确认 + 持久化 + 手动 ack + 死信 + 定时兜底'五层,还能答'消费端控制并发 + 背压避免把 DB 打挂'——这是真实面试里区分中级和高级的地方。"
6. 🟢 多级缓存架构怎么设计?怎么保证各级一致?
怎么答:本地缓存(Caffeine,最快、抗热点、扛住 Redis 抖动)+ 分布式缓存(Redis,多实例共享)+ DB。读取顺序:本地 → Redis → DB,逐层回填。一致性:数据变更时,删 Redis + 通过 MQ/Redis 发布订阅广播通知各节点清本地缓存。
追问:本地缓存怎么和 Redis 保持一致?本地缓存过期策略?热点数据怎么识别?
往项目引 ⭐:"我项目爆款商品详情用 Caffeine + Redis 两级——热 key 大部分在本地命中、扛住了大促;Redis 数据改了用 pub/sub 广播通知各节点清本地缓存,本地缓存也设了较短过期兜底。兼顾了性能和一致性。"
7. 🔴 让你设计一个秒杀系统,整体怎么做?
怎么答:分层削流——① 前端:按钮置灰、答题/验证码、静态化页面、CDN。② 网关:限流(令牌桶)。③ 应用层:Redis 预扣库存(Lua 原子防超卖)、一人一单校验。④ MQ 异步下单:把扣减成功的请求丢 MQ 异步落库,削峰。⑤ DB:最终落库,乐观锁兜底。再加热点隔离、降级、防刷。
追问:怎么防超卖?怎么防黄牛刷?Redis 和 DB 库存怎么最终一致?没抢到的请求怎么快速返回?
往项目引 ⭐:"我项目做过秒杀,核心就是'Redis 扛流量、MQ 削峰、DB 兜底'三板斧,加上一人一单和限流防刷。能把每一层为什么这么做、解决什么问题讲清楚,比堆架构图更打动面试官。"
8. 🟢 订单 30 分钟未支付自动取消怎么实现?
怎么答:三种方案对比——
- MQ 延迟消息(RocketMQ 延迟级别,推荐):下单时发一条 30 分钟延迟消息,到点消费检查未支付就取消 + 回滚库存。
- Redis ZSet:score 存到期时间,轮询取到期任务。
- 定时任务扫表:简单但有延迟、扫全表压力大、不精准。
追问:延迟消息丢了订单一直不取消怎么办?大量订单同一时刻到期怎么扛?取消时库存怎么回滚、怎么防止重复取消?
往项目引 ⭐:"我项目用 RocketMQ 延迟消息——下单发延迟消息,到点消费检查:还没支付就取消并回滚预扣库存,已支付就忽略(幂等)。比定时扫表精准、对 DB 友好。还加了定时任务对长期未处理的兜底,防止消息丢失。"
9. 🟢 你平时接到一个开发需求,是怎么一步步落地的?(考工程素养)
怎么答:① 理解需求(边界、异常分支,不明确就主动找产品/上级确认)→ ② 设计(简单的直接建表写接口,复杂的先画流程图/时序图、设计表和接口)→ ③ 开发 + 自测(写代码、单测、自己跑通主流程和异常)→ ④ 联调(和前端/对接方约定字段提前对齐)→ ⑤ 提测、上线、观察。
追问:需求不明确怎么办?和其他系统联调怎么对接?怎么保证质量?排期怎么估?
往项目引 ⭐:"我项目接需求会先确认边界和异常场景、复杂的先画流程图理清再动手,联调前先和对接方把接口字段、异常码约定好。这题考的是'靠不靠谱',讲清流程比讲技术更能体现工程素养。"
10. 🔴 多租户 SaaS 的数据怎么隔离?
怎么答:三种隔离级别——① 独立数据库(物理隔离,安全要求高的大客户);② 共享库、独立 Schema;③ 共享表 + tenant_id 字段(成本最低)。SaaS 常用第三种 + 关键客户第一种。第三种的关键:用 MyBatis 拦截器从 token 解析租户 id、自动给所有 SQL 拼 where tenant_id=?,业务代码无感知。
追问:怎么防止查到别的租户数据?租户 id 从哪来、怎么传递?跨租户的统计怎么做?
往项目引 ⭐:"我项目是 SaaS,用 MyBatis 拦截器从请求 token 解析租户 id、存 ThreadLocal,自动给所有 SQL 加租户条件,业务层完全无感知——从根上防止越权查到别家数据,这比每个 SQL 手动加条件可靠得多。"
11. 🟢 一个慢接口,你怎么排查和优化?
怎么答:先定位——用链路追踪(SkyWalking)/日志看耗时在哪段(SQL?下游调用?计算?序列化?)。再对症优化:慢 SQL 就 EXPLAIN 加索引;N+1 就改批量查;下游慢就加缓存/异步/并行调用;大数据量就分页/流式。最后用数据验证优化效果。
追问:怎么知道慢在哪一步?优化后怎么验证?如果是偶发慢呢?
往项目引 ⭐:"我项目首页接口曾经 2 秒,用 SkyWalking 定位到是串行调了三个下游服务,改成 CompletableFuture 并行后降到几百毫秒。有定位手段、有优化方案、有前后数字对比——这套'定位→优化→验证'的闭环最有说服力。"
12. 🔴 怎么保证两个系统/两张表的数据最终一致?(对账)
怎么答:实时层用 MQ 最终一致(变更发消息、对方消费更新);再加定时对账任务兜底——定时比对两边数据,发现不一致就自动补偿修正或告警人工处理。关键是"实时同步 + 定时对账"双保险。
追问:对账发现不一致怎么自动修?对账任务本身慢/数据量大怎么办?补偿会不会引入新的不一致?
往项目引 ⭐:"我项目支付流水和订单状态用 MQ 实时同步,再用每天的对账任务比对支付系统和订单系统的数据,不一致的自动补偿或报警人工核对——这是涉及钱的业务必做的兜底,'最终一致 + 对账'是真实生产的标准做法。"
13. 🟢 项目里哪里用到了消息队列?解决了什么?
怎么答:三大用途结合场景讲——异步(下单后异步发短信/加积分/推送,提升主流程响应)、解耦(上下游不直接依赖,新增消费方不改生产方)、削峰(秒杀/大促把瞬时高流量缓冲到 MQ 慢慢消费)。
追问:消息丢失/重复/积压/顺序怎么处理?为什么选这个 MQ(Kafka/RocketMQ/RabbitMQ)?
往项目引 ⭐:"我项目下单成功后发 MQ,让积分、通知、统计这些非核心逻辑异步处理——主流程只管下单、响应快,新增一个'下单送优惠券'的需求只要加个消费者、不动下单代码。异步、解耦、削峰三个价值都能举出项目里的例子。"
14. 🟢 你项目里用了哪些设计模式?解决了什么?
怎么答:结合场景说,别只报名字。策略 + 工厂(多渠道支付/计费,新增渠道不改老代码)、模板方法(固定流程骨架,子类填差异)、责任链(多级风控/参数校验)、观察者(事件通知解耦)、建造者(复杂对象构建)。重点说为什么用、解决了什么、不用会怎样。
追问:为什么用这个模式?不用模式会有什么问题?这个模式有什么缺点?
往项目引 ⭐:"我项目多渠道支付用策略 + 工厂——每个渠道一个策略实现、工厂按渠道返回对应策略,新增渠道只加一个实现类、不改原有代码,符合开闭原则。能说出'解决了什么、符合什么原则'比背 23 种模式强十倍。"
15. 🔴 线上出问题(CPU 飙高 / 接口超时 / OOM)你怎么排查?
怎么答:
- CPU 飙高:
top定位进程 →top -Hp 进程定位线程 → 线程 id 转 16 进制 →jstack看该线程栈,找热点代码(常是死循环、频繁 GC)。 - 接口超时:链路追踪定位慢的环节 → 用 traceId 串日志 → 查 SQL/GC/下游。
- OOM:
-XX:+HeapDumpOnOutOfMemoryError导出 dump → MAT 分析大对象/泄漏点。
追问:内存泄漏和内存溢出区别?怎么不影响线上排查(Arthas)?GC 频繁怎么调?
往项目引 ⭐:"我项目处理过一次线上 CPU 100%——top -Hp + jstack 定位到一段异常导致的死循环,10 分钟定位修复。有完整的排查命令链,面试官会觉得你真扛过线上事故,这是工作年限的体现。"
16. 🟢 接口怎么做幂等?(结合下单场景)
怎么答:token 机制(进结算页发 token、提交时校验并删除、用一次)+ 唯一索引(订单号唯一,重复插入失败)+ 状态机(已处理的状态不再处理)。多重保险,前端重复点、网络重试、MQ 重复消费都拦得住。
追问:分布式下 token 放哪?并发同时来两个请求怎么办?校验和删除怎么保证原子?
往项目引 ⭐:"我项目下单防重,进页面发一个 Redis token,提交时用 Lua 脚本原子校验并删除,配合订单号唯一索引兜底——重复点击只会成功一笔。Lua 保证'查 token + 删 token'原子,避免并发漏判。"
17. 🔴 怎么写一篇技术方案?重点是什么?
怎么答:结构——① 背景和目标 → ② 现状和问题 → ③ 方案设计(给 2 个方案对比) → ④ 选型理由和取舍 → ⑤ 风险和应对 → ⑥ 落地步骤和排期。重点是方案对比 + 为什么这么选,体现你的权衡能力,而不是只写"我要怎么做"。
追问:为什么选这个方案不选那个?有什么风险?怎么回滚?对现有系统有什么影响?
往项目引 ⭐:"我项目重要改动都先写技术方案评审,我写的重点是'方案对比 + 取舍理由 + 风险预案'。这题面试官是想看你有没有架构思维、能不能独立设计,而不只是接需求写代码——能讲出取舍就是高级的信号。"
18. 🟢 限流在你项目哪里用到?怎么设计的?
怎么答:分层限流——网关全局限流(保护整体)、热点接口单独限流(秒杀、短信、登录)、对第三方调用限流(防止把下游或自己拖垮)。算法多用令牌桶(Sentinel)。被限流的请求优雅处理(返回"请稍后再试"而非报错)。
追问:限流阈值怎么定?单机限流还是分布式限流?被限的请求怎么处理?限流和熔断区别?
往项目引 ⭐:"我项目短信接口对手机号做滑动窗口限流(一分钟一条)、秒杀接口在网关做 QPS 限流,阈值是压测 + 留余量定的,被限的返回友好提示。能说出'在哪限、用什么算法、阈值怎么来、被限怎么办'就够细了。"
19. 🔴 大数据量导入/导出怎么做?
怎么答:
- 导入:分批读 + 批量插入(
insert batch)+ 异步处理 + 进度反馈,绝不一次性全加载到内存。校验失败的行单独记录返回。 - 导出:游标/分页查询 + 流式写(EasyExcel 边读边写),避免一次性查全量 OOM;大文件可异步生成 + 通知下载。
追问:导入十万条怎么不超时不 OOM?失败的行怎么处理?导出百万行怎么不内存爆?
往项目引 ⭐:"我项目商品批量导入用 EasyExcel 流式读 + 分批入库 + 线程池并行,十万条从几分钟降到几十秒,失败的行单独收集返回给用户修正;导出用游标分页 + 流式写避免 OOM。有数字、有具体技术,很实在。"
20. 🟢 你项目的难点是什么?(必问,最该提前准备)
怎么答:选一个真有技术深度、你真的做过的点,按"难在哪 → 怎么分析 → 怎么解决 → 效果(数字)"四步讲。别说"需求经常变""时间紧"这种没技术含量的。难点要能撑住面试官往死里追技术细节。
追问:会顺着这个难点一路追技术原理、追"为什么不用别的方案"、追"还有没有更好的做法"。
往项目引 ⭐:"我准备的难点是'好差评高并发下的同步阻塞':先理清评论→审核→入库→统计的链路,定位到同步处理扛不住并发,用 MQ 解耦 + 限流削峰解决,响应时间和稳定性都上去了。这是从真实面经里提炼的难点,面试官最爱追这种——提前把追问的每一层都准备好,就不会被问倒。"
你能答到第几层?
- 三段都能答、还能落到自己项目:你讲项目时追问不倒,这是面试里最值钱的能力。
- 只能答设计思路、落不到项目:知识有了,差的是绑到一个你真做过的有体量项目上——这正是我们带项目时反复练的。
- 答不上来:项目场景题靠的是真做过有体量的项目,这也是为什么我们强调做真实项目而不是背题——项目场景题逼着你把知识用起来。
这是面试专题的「项目场景篇」,是最能体现真实水平的一篇。网站上还有并发、MySQL、Redis、Spring、微服务等系统整理。 🌐 更多真实面试专题与资料:smallredtech.com 💬 想系统学 / 简历与辅导咨询,加微信:Ahongbb666(备注「面试题」)