文章标题:
文章内容:
面试官(推了推眼镜,面无表情):请进。
谢飞机(穿着拖鞋、T恤印着“Hello World”,头发炸成鸡窝):来了来了!我就是那个写了三年CRUD、精通面向百度编程的谢飞机!
面试官(皱眉):……我们开始吧。今天围绕一个电商秒杀系统展开技术提问,你准备好了吗?
谢飞机(挺胸):Ready!GKD!
✅ 第一轮:基础架构选型与核心语言能力
Q1:如果让你设计一个高并发的秒杀系统,你会选择哪个Java版本和框架?为什么?
谢飞机:那必须是 Java 17 + Spring Boot 3.x 啊!听说性能提升了30%,而且支持虚拟线程(Virtual Threads),妈妈再也不用担心线程池爆了!
面试官(点头):不错,Java 17 的 ZGC 和虚拟线程确实适合高并发场景。继续。
Q2:秒杀请求瞬间爆发,传统 Servlet 容器扛不住,你怎么优化Web层?
谢飞机:我上 Spring WebFlux!基于 Reactor 模型,非阻塞 IO,单线程能处理几千连接,比 Tomcat 香多了!
面试官(微微一笑):很好,说明你了解响应式编程的价值。那数据库连接也得跟上吧?
Q3:在高并发下,数据库连接池怎么选?HikariCP 和 C3P0 有什么区别?
谢飞机:当然是 HikariCP!它是最快的连接池,像火箭一样!C3P0?那是十年前老项目用的,慢得像拖拉机……
面试官(轻笑):比喻生动。HikariCP 确实以性能和轻量著称,生产环境首选。
✅ 第一轮小结:谢飞机答得稳准狠,基本功扎实,面试官内心OS:这小子有点东西。
🔁 第二轮:数据一致性与缓存穿透防御
Q4:秒杀商品库存只有100件,如何防止超卖?用 Redis 可以吗?
谢飞机:当然可以!我把库存放 Redis 里,扣减用 DECR 命令,原子操作嘛!谁抢到谁赢!
面试官(挑眉):如果 Redis 挂了呢?或者缓存穿透导致查库太多?
Q5:大量恶意请求查询不存在的商品ID,造成数据库压力,怎么办?
谢飞机:呃……加个默认值呗,比如 -1,表示没这商品,下次就不查了……(挠头)
面试官:这叫 缓存空值(Cache Null),可以。还有更优雅的方式吗?
谢飞机:啊……布隆过滤器?Bloom Filter?我在网上抄过代码……
面试官(点头):对,用 布隆过滤器预判 key 是否存在,提前拦截非法请求,保护数据库。
Q6:Redis 扣库存后,怎么保证最终写入 MySQL 不出错?
谢飞机:我……我先扣 Redis,再发个消息给 MQ,让消费端慢慢写 DB……应该不会丢吧?
面试官:思路正确。这就是典型的 异步削峰 + 最终一致性。可以用 Kafka 保证消息可靠投递。
⚠️ 第二轮点评:谢飞机勉强过关,但原理模糊,靠“听说过”撑场面。
🔥 第三轮:分布式难题与容错机制
Q7:用户抢到了,但支付超时,怎么回滚库存?
谢飞机:啊?这……我让他重新抢?不行不行……要不我定时任务每天扫一遍?
面试官(扶额):这是典型的 订单状态机 + 超时补偿 场景。你应该结合 RabbitMQ 延迟队列 或 Redisson 分布式锁+延时任务,超时未支付就触发库存回补。
Q8:多个服务部署在 Kubernetes,如何统一配置管理和服务发现?
谢飞机:K8s 自带服务发现啊!ConfigMap 存配置,Pod 启动时挂载就行!简单!
面试官:如果配置频繁变更呢?要不要重启 Pod?
谢飞机:呃……那我用 Spring Cloud Config?还是……Consul?
面试官:可以集成 Spring Cloud Kubernetes 或 Apollo/Nacos 实现动态刷新,无需重启。
Q9:系统出问题了,怎么定位瓶颈?监控怎么做?
谢飞机:我看日志啊!Logback 打出来,grep 一下 keyword……不行就重启!
面试官(叹气):我们需要的是可观测性。建议接入 Prometheus + Grafana 监控 QPS、延迟;用 ELK 收集日志;Jaeger/Zipkin 做链路追踪,快速定位慢请求。
❌ 第三轮总结:谢飞机彻底露馅,全靠关键词堆砌,缺乏系统思维。
面试官(合上笔记本,平静地说):
谢先生,感谢您的参与。您对部分技术有了解,但在分布式一致性、容错设计和系统观方面还需加强。我们会综合评估,回去等通知吧。
谢飞机(起身,自信满满):没问题!我回去就背《Java 核心卷》第三遍!
(门关上,面试官默默写下:此人擅长表演,慎用。)
✅ 附录:完整答案解析(小白也能学会)
🎯 业务场景:电商秒杀系统
- 特点:瞬时高并发、热点数据集中、强一致性要求(不能超卖)、用户体验敏感。
- 技术目标:抗住流量洪峰、防止超卖、快速响应、可监控可运维。
💡 技术点详解:
1. Java 17 + Spring Boot 3
- Java 17 是 LTS 版本,支持虚拟线程(Project Loom),极大降低并发成本。
- Spring Boot 3 默认响应式支持,整合 WebFlux、Reactive Redis 更高效。
2. Spring WebFlux vs Spring MVC
- MVC 是同步阻塞模型,每个请求占一个线程。
- WebFlux 是响应式模型,基于事件循环,少量线程处理大量连接,适合 I/O 密集型场景如秒杀。
3. HikariCP 连接池优势
- 性能极高(官方宣称最快),轻量、无额外依赖。
- 对比 C3P0:启动慢、配置复杂、性能差,已被淘汰。
4. Redis 扣减库存防超卖
- 使用
DECR key原子操作扣减库存。 - 结合 Lua 脚本实现“判断+扣减”原子性:
if redis.call('GET', KEYS[1]) > 0 then return redis.call('DECR', KEYS[1]) else return -1 end
5. 缓存穿透解决方案
- 缓存空值:查询不到也存
null,设置短过期时间(如1分钟)。 - 布隆过滤器:前置过滤非法 key,误判率低,内存占用小。
- 工具推荐:Google Guava BloomFilter 或 Redisson 提供的 RBloomFilter。
6. 最终一致性保障
- 利用 Kafka/RabbitMQ 异步解耦:
- 下单成功 → 发消息 → 消费者写数据库。
- 支持重试、死信队列、幂等消费。
- 数据库更新失败可通过 最大努力通知 + 对账任务 修复。
7. 库存回滚机制
- 用户下单后启动 延迟消息(如 RabbitMQ TTL+死信 / Kafka 时间戳 / Redisson 延时任务)。
- 若未支付,则触发库存返还,并通知用户“已失效”。
8. K8s 配置热更新
- 使用 Spring Cloud Kubernetes 或 Nacos/Apollo。
- 配置变更时,通过事件监听自动刷新 Bean,无需重启 Pod。
9. 系统可观测性三大支柱
- 日志:Logback + Logstash → ELK Stack 可视化。
- 指标:Micrometer 暴露指标 → Prometheus 抓取 → Grafana 展示。
- 链路追踪:Sleuth + Zipkin/Jaeger,追踪一次请求跨服务调用路径。
🛠️ 推荐技术栈组合(秒杀系统)
| 模块 | 推荐技术 | |----------------|-----------------------------------| | 开发框架 | Spring Boot 3 + WebFlux | | JVM | Java 17 + ZGC | | 缓存 | Redis (Cluster) + BloomFilter | | 消息队列 | Kafka / RabbitMQ | | 数据库 | MySQL + HikariCP | | ORM | MyBatis Plus / JPA | | 监控 | Prometheus + Grafana + ELK | | 部署 | Docker + Kubernetes | | CI/CD | Jenkins/GitLab CI | | 安全 | JWT + OAuth2 + Spring Security |

被折叠的 条评论
为什么被折叠?



