Java大厂面试实战:Spring Boot + Kafka + Redis 在电商秒杀场景中的应用与避坑指南
面试官(正襟危坐,推了推眼镜):欢迎来参加我们电商平台核心系统开发岗的面试,请做个自我介绍。
GGBond(挠头傻笑):我叫GGBond,三年Java经验,精通HelloWorld,熟悉Ctrl+C/V编程法,擅长面向百度开发……
第一轮:基础技术栈考察(围绕电商秒杀场景)
面试官:我们正在做一个高并发的秒杀系统,选用的是Spring Boot作为主框架,说说你为什么选它?
GGBond:因为……创建项目快!加个注解就启动,不用配XML,贼方便!
面试官(点头):不错,Spring Boot自动配置简化了开发。那数据库连接池用哪个?
GGBond:HikariCP!听说它像闪电侠一样快,而且内存占用低。
面试官:很好。如果要记录用户抢购日志,你会怎么选型日志框架?
GGBond:SLF4J + Logback!SLF4J是门面,Logback性能强,还能动态改日志级别。
面试官:有思路。那假如我们要做接口文档,让前端联调更高效?
GGBond:Swagger/OpenAPI!写个注解自动生成页面,还能在线测试,美滋滋~
面试官(微笑):基础扎实,继续。
第二轮:中间件与高并发设计(深入秒杀架构)
面试官:秒杀时瞬时流量暴涨,直接打到数据库会崩,你怎么解决?
GGBond:先……先上Redis!把商品库存缓存起来,用户先减缓存库存,再异步扣数据库。
面试官:合理。那Redis扣库存时,怎么防止超卖?
GGBond:呃……用setnx?还是getset?啊!我记混了!应该是用Lua脚本保证原子性!
面试官:接近答案。那如果用户抢到了,要发短信、更新订单、通知仓库,这些操作必须全部成功吗?
GGBond:当然要!一个都不能少!
面试官:错了。这类操作应通过消息队列解耦。用哪个?
GGBond:Kafka!吞吐量大,还能持久化。不过……消费失败咋办?重试?
面试官:可以结合死信队列和重试机制。那Kafka如何保证顺序消费?
GGBond:呃……同一个topic?同一个partition?消费者单线程?好像是这样……
面试官(皱眉):答得不完整,但方向对。
第三轮:微服务与系统稳定性(扩展至云原生)
面试官:我们的服务拆成了订单、库存、用户、支付等微服务,怎么调用?
GGBond:用OpenFeign!声明式客户端,写个接口就能远程调用,爽!
面试官:如果库存服务挂了,订单服务一直等,会怎样?
GGBond:呃……会卡住?然后整个系统都卡?
面试官:这就是雪崩。怎么防?
GGBond:加熔断!Resilience4j?或者Hystrix?我只听说过名字……
面试官:Spring Cloud里可以用Resilience4j实现熔断降级。那服务注册发现用什么?
GGBond:Eureka!或者Consul!它们能让服务互相找到。
面试官:最后一个问题:如何监控整个系统的性能?
GGBond:看日志?用ELK搜错误……还有Prometheus抓指标,Grafana画图?我配过一次,但忘了端口是9090还是8080……
面试官(叹气):基础知识还行,深度不够。这样吧,你先回去等通知,我们会邮件联系你。
GGBond(开心):好嘞!我回去就把简历改成‘精通微服务监控’!
面试问题详解:电商秒杀系统的技术实现路径
业务场景背景
电商秒杀是典型的高并发场景,短时间内大量用户请求涌入,对系统稳定性、响应速度、数据一致性要求极高。常见挑战包括:
- 数据库压力过大
- 超卖问题(库存为负)
- 服务雪崩
- 接口调试困难
- 操作无法追踪
技术点解析
1. 为什么用 Spring Boot?
- 自动配置:减少XML配置,快速搭建项目
- 起步依赖:如
spring-boot-starter-web一键集成Web环境 - 内嵌容器:无需部署WAR包,直接运行jar
- 生产就绪:内置健康检查、指标暴露等
👉 适用于快速构建微服务模块。
2. HikariCP vs C3P0
| 特性 | HikariCP | C3P0 | |--------------|----------------|----------------| | 性能 | 极快(字节码优化) | 较慢 | | 内存占用 | 低 | 高 | | 连接泄漏检测 | 支持 | 支持 |
✅ 生产推荐 HikariCP。
3. SLF4J + Logback 组合优势
- SLF4J 是日志门面,统一API
- Logback 是具体实现,性能优于 Log4j
- 支持异步日志、滚动策略、条件输出
搭配 logback-spring.xml 可实现多环境配置。
4. Swagger/OpenAPI 的作用
- 自动生成 REST API 文档
- 提供在线测试界面
- 支持导出 OpenAPI 规范文件
- 与前端协作更高效
使用 @ApiOperation 等注解即可标注接口。
5. Redis 防止超卖的正确姿势
不能简单用 GET + DECR,会有并发问题。正确做法:
-- Lua脚本保证原子性
local stock = redis.call('GET', KEYS[1])
if not stock then
return -1
end
if tonumber(stock) <= 0 then
return 0
end
redis.call('DECR', KEYS[1])
return 1
通过 redisTemplate.execute(new DefaultRedisScript<>(luaScript, Long.class)) 执行。
6. Kafka 解耦异步流程
秒杀成功后,发送消息到 Kafka:
- 订单服务:创建订单
- 短信服务:发送通知
- 仓储服务:准备发货
- 用户服务:增加积分
✅ 异步化提升响应速度,避免同步阻塞。
保证顺序消费:
- 单 partition 内消息有序
- 生产者指定 key(如 userId),确保同一用户消息进同一 partition
- 消费者单线程消费(或使用 Kafka Streams)
7. 微服务调用与容错
- OpenFeign:声明式HTTP客户端,简化远程调用
- Resilience4j:轻量级熔断器,支持熔断、限流、重试
- Eureka/Consul:服务注册与发现,实现动态路由
示例配置熔断:
resilience4j.circuitbreaker:
instances:
inventoryService:
failureRateThreshold: 50%
waitDurationInOpenState: 5s
slidingWindowSize: 10
8. 系统监控体系
- Prometheus:拉取式指标收集(如JVM、HTTP请求数)
- Grafana:可视化展示监控图表
- ELK Stack(Elasticsearch + Logstash + Kibana):集中式日志分析
- Micrometer:Spring Boot 应用指标暴露工具
可实现:
- 实时查看QPS、响应时间
- 快速定位异常日志
- 设置告警规则(如CPU > 80%)
总结
本次面试围绕“电商秒杀”场景,层层递进考察了:
- 基础技术选型能力(Spring Boot, Redis, Kafka)
- 高并发处理思维(缓存、消息队列、原子操作)
- 微服务架构理解(服务调用、熔断、注册中心)
- 系统可观测性意识(日志、监控、链路追踪)
虽然 GGBond 回答有些含糊,但提示了学习方向。建议开发者:
- 动手搭建一个秒杀Demo
- 深入理解中间件原理
- 掌握从单体到微服务的演进路径
只有真正理解“为什么用”,才能在面试中脱颖而出!
776

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



