面试现场:电商大促背后的Java技术栈拷问
面试官(推了推眼镜):欢迎来到字节跳动电商事业部的终面。我是你的技术面试官老王。
谢飞机(搓手傻笑):您好王哥!我准备好了,您随便问!
🟢 第一轮:基础构建与Web框架(Spring Boot + Maven + REST)
Q1:我们有个秒杀活动,用Spring Boot做服务,你怎么组织项目结构?依赖管理用什么?
谢飞机:这个我会!我用Maven建module,比如user-service、order-service,父POM统一版本。Spring Boot starters贼方便,web、data-jpa一键引入!
面试官(点头):不错,懂得模块化。那接口怎么设计规范?
Q2:如果要返回统一格式 {code: 0, data: {}, msg: "ok"},你怎么实现?
谢飞机:我用@ControllerAdvice搞个全局异常处理器,再写个ResponseEntity包装类,所有controller都返回它!
面试官:很好,有工程化思维。继续——
Q3:订单创建成功要发短信,你是直接在Controller里调sendSms()吗?
谢飞机(挠头):呃…以前是这么干的…但现在学聪明了!我用@Async异步调用,不卡主线程!
面试官:还行吧,至少知道解耦。但异步也有风险,先记着。
🟡 第二轮:数据持久化与缓存(JPA + Redis + HikariCP)
Q4:订单量太大,数据库扛不住,你怎么优化?
谢飞机:加索引!分表!还有…Redis缓存热点商品信息!我查一次放redis,下次直接拿!
面试官:HikariCP连接池参数怎么设?maxPoolSize多少合适?
谢飞机:呃…默认是10?我一般改成50…再多怕把数据库压垮…
面试官(皱眉):凭感觉?生产环境得压测调优。
Q5:缓存穿透怎么办?比如黑客刷不存在的商品ID。
谢飞机:我…我让缓存null值五分钟!还有一个布隆过滤器?名字听着像面包机…
面试官:答对一半。布隆过滤器防穿透,空值缓存防击穿,别混了。
🔴 第三轮:微服务与消息队列(Spring Cloud + Kafka + Resilience4j)
Q6:用户下单后要通知库存、物流、积分三个服务,用HTTP调用行不行?
谢飞机:可以啊,FeignClient互相调呗,我配个Ribbon负载均衡!
面试官:如果物流系统挂了,订单也失败?这合理吗?
谢飞机(慌张):那…那我try-catch住?或者重试十次!
面试官:这是典型同步阻塞。试试消息队列。
Q7:Kafka怎么保证订单消息不丢?万一消费者宕机呢?
谢飞机:我…我提交offset!自动提交!
面试官:自动提交可能重复消费或丢失。手动提交了解吗?
谢飞机:手动?是不是消费完再commit…具体API我忘了…
面试官(叹气):最后一个问题——
Q8:大促时突然流量暴增,怎么防止系统雪崩?
谢飞机:加服务器!扩容!阿里云一键升配!
面试官:资源有限呢?
谢飞机:那…那就限流?Nginx可以限速…Java里好像有Sentinel?我没用过…
面试官:Resilience4j可以熔断降级。今天就到这里。
谢飞机:王哥,我表现咋样?
面试官:回家等通知吧。
✅ 答案详解:电商高并发系统的完整技术链路
场景背景
大型电商平台在“双11”期间面临瞬时百万级QPS,需保障订单、库存、支付等核心链路稳定。以下为真实架构设计要点。
一、项目构建与服务治理(Maven + Spring Boot)
- 模块化设计:使用Maven多模块拆分业务,如
order-api,order-service,order-dao,通过dependencyManagement统一版本。 - RESTful规范:使用
@RestControllerAdvice+ResponseBodyAdvice实现统一响应体,避免每个接口手工封装。 - 异步解耦:订单创建后,通过
@Async将短信、日志等非核心逻辑异步执行,提升响应速度。注意启用@EnableAsync并配置线程池。
二、数据库与缓存优化(JPA + Redis + HikariCP)
- 连接池调优:HikariCP的
maximumPoolSize建议设置为(CPU核心数 * 2),通常8核机器设16~32。避免盲目设大导致DB连接耗尽。 - 缓存策略:
- 缓存穿透:使用布隆过滤器(Bloom Filter)提前拦截无效请求,或对不存在的数据缓存空值(ttl较短)。
- 缓存击穿:热点key加互斥锁(Redis SETNX),防止并发重建缓存。
- 缓存雪崩:不同key设置随机过期时间,避免集体失效。
三、异步通信与容错设计(Kafka + Resilience4j)
- 消息可靠性:
- 生产者:设置
acks=all,retries>0,确保消息写入ISR副本。 - 消费者:关闭自动提交,业务处理成功后手动提交offset,防止“消费未完成即提交”导致消息丢失。
- 生产者:设置
- 服务熔断:使用Resilience4j的CircuitBreaker,在下游服务(如物流)异常时快速失败,返回兜底逻辑(如“延迟发货”),避免线程堆积。
- 限流降级:通过RateLimiter限制每秒请求数,结合Bulkhead隔离关键资源。
四、整体架构图示意
用户请求 → Nginx → Spring Boot(Order Service)
↓
Kafka → Inventory Service
↓
Logistics Service
↓
Points Service
↓
DB + Redis Cluster
推荐技术组合
| 场景 | 推荐方案 | |----------------|-----------------------------------| | 项目构建 | Maven + Spring Boot Parent | | Web框架 | Spring Boot Web + OpenAPI | | 数据库 | MySQL + MyBatis-Plus | | 连接池 | HikariCP | | 缓存 | Redis + Spring Cache | | 消息队列 | Kafka(高吞吐)或 RabbitMQ(可靠)| | 微服务治理 | Spring Cloud Alibaba + Nacos | | 容错 | Resilience4j | | 监控 | Prometheus + Grafana + Micrometer|
总结
谢飞机虽然有些概念模糊,但基础尚可。真正的高并发系统需要:
- 异步化:用消息队列解耦核心流程
- 缓存层级:多级缓存(本地+Caffeine+Redis)
- 容错设计:熔断、降级、限流三位一体
- 可观测性:日志、监控、链路追踪缺一不可
掌握这些,才能真正扛住电商大促的洪峰流量。