Java面试实战:电商高并发与分布式事务处理
Java面试实战:电商高并发与分布式事务处理
面试现场:电商技术终面室
面试官:谢飞机同学,今天我们聚焦电商系统的高并发架构和分布式事务处理技术。 谢飞机:(自信地)面试官好!我研究过双十一架构,秒杀系统、分布式事务这些我都懂!
第一轮:电商基础架构
面试官:请详细描述电商秒杀系统的架构设计,如何解决高并发和超卖问题? 谢飞机:(眼睛发亮)秒杀系统要限流!用Redis预减库存!消息队列异步下单!超卖问题用Redis分布式锁!对,还有前端限流按钮置灰! 面试官:(点头)不错。Redis的分布式锁实现有哪些方式?Redisson和自研实现各有什么优缺点? 谢飞机:Redisson封装了各种锁!有可重入锁、公平锁、红锁!自研用SET NX EX命令!Redisson优点是功能全,缺点是多依赖;自研轻量但要处理超时释放问题! 面试官:如何设计一个高可用的商品详情页?静态化和缓存策略是什么? 谢飞机:(挠头)商品详情页用Nginx静态化!CDN加速!缓存分多级:本地缓存Caffeine→Redis→数据库!热点商品预热!
第二轮:高并发处理
面试官:电商系统的流量削峰有哪些策略?消息队列在其中扮演什么角色? 谢飞机:(快速回答)削峰用队列缓冲!请求排队!消息队列解耦、削峰、异步通信!Kafka吞吐量高适合秒杀!RabbitMQ有死信队列适合订单超时处理! 面试官:如何优化MySQL在高并发场景下的性能?分库分表的实现方案和挑战是什么? 谢飞机:加索引!读写分离!分库分表用Sharding-JDBC!水平分表按用户ID哈希!挑战是分布式事务和跨表查询! 面试官:Redis集群的部署方式有哪些?哨兵模式和Cluster模式的区别是什么?如何处理缓存穿透、击穿和雪崩? 谢飞机:(语速加快)有主从、哨兵、Cluster!哨兵是主从切换,Cluster是分片存储!穿透用布隆过滤器!击穿用互斥锁!雪崩设置不同过期时间!
第三轮:分布式事务与安全
面试官:电商支付场景中如何保证分布式事务的一致性?Seata的AT模式和TCC模式有什么区别? 谢飞机:(眼神飘忽)用Seata!AT模式自动生成undo log!TCC要手写Try-Confirm-Cancel!AT模式侵入性低,TCC性能好! 面试官:如何设计一个防重复提交的方案?令牌桶算法和漏桶算法的应用场景是什么? 谢飞机:前端按钮置灰!后端用Redis存token!令牌桶允许突发流量,漏桶控制流出速率!秒杀用令牌桶! 面试官:电商系统的接口安全有哪些措施?如何防止接口被恶意调用和数据泄露? 谢飞机:(紧张地)用HTTPS!接口签名!时间戳防重放!限流!敏感数据加密!输入校验! 面试官:(合上电脑)今天的面试就到这里,请回家等通知。 谢飞机:(松口气)好的!希望能收到好消息!
技术点深度解析
一、秒杀系统架构
-
核心架构设计
客户端 → CDN → 负载均衡 → 限流层 → 应用服务 → 消息队列 → 数据库
- 限流层:Nginx限流 + Redis计数器
- 应用服务:无状态设计,水平扩展
- 数据层:Redis预扣库存,数据库最终一致性
-
超卖问题解决方案
- Redis预扣库存:
// 库存预扣 Long remain = redisTemplate.opsForValue().decrement("seckill:stock:" + goodsId); if (remain < 0) {// 库存不足,回滚redisTemplate.opsForValue().increment("seckill:stock:" + goodsId);return "库存不足"; }
- 分布式锁:Redisson可重入锁保证原子操作
- 数据库最终校验:最终库存以数据库为准,定期对账
- Redis预扣库存:
二、Redis高可用方案
-
部署模式对比 | 模式 | 优点 | 缺点 | 适用场景 | |------|------|------|----------| | 主从 | 简单,读写分离 | 手动故障转移 | 开发环境 | | 哨兵 | 自动故障转移 | 不能水平扩展 | 中小规模 | | Cluster | 分片存储,水平扩展 | 运维复杂 | 大规模生产环境 |
-
缓存三大问题解决方案
- 缓存穿透:
- 布隆过滤器过滤无效key
- 空值缓存 + 短期过期
- 缓存击穿:
- 互斥锁(Redis SET NX)
- 热点数据永不过期
- 缓存雪崩:
- 过期时间加随机值
- 多级缓存
- Redis集群
- 缓存穿透:
三、分布式事务实战
-
Seata AT模式原理
- 一阶段:
- 解析SQL,生成undo/redo log
- 执行SQL并提交本地事务
- 上报事务状态
- 二阶段:
- 成功:异步删除undo log
- 失败:根据undo log回滚
- 适用场景:无侵入,适用于大多数业务场景
- 一阶段:
-
TCC模式实现
// Try阶段:预扣库存 @Transactional public boolean tryDeductStock(Long goodsId, int quantity) {// 检查库存// 预扣库存(状态标记为冻结) }// Confirm阶段:确认扣减 @Transactional public boolean confirmDeductStock(Long goodsId, int quantity) {// 将冻结库存转为实际扣减 }// Cancel阶段:取消扣减 @Transactional public boolean cancelDeductStock(Long goodsId, int quantity) {// 回滚冻结库存 }
- 适用场景:高性能要求,如金融支付
面试锦囊:电商场景是大厂面试高频考点,重点掌握高并发处理三板斧(限流、缓存、异步)和分布式事务解决方案。准备一个完整的秒杀系统设计方案,能显著提升面试通过率。