虾皮SSC后台二面面经
《面试题目》
- 实习经历:介绍实习内容及工作难点。
- 数据一致性:若消息体字段丢失或漏发,如何保证上下游数据一致性或进行对账?(讨论点:定时任务对账、增量更新、数据比对、时间戳机制)。
- 手撕代码(秒杀系统):实现高吞吐、防超卖、限购两单逻辑。
- 第一阶段:基于点评逻辑的初稿。
- 第二阶段:使用 Lua 脚本进行库存判断,DB 层插入记录。
- 第三阶段:双重 Lua 校验(库存+资格校验),探讨 MySQL 并发问题及分布式锁的应用(商品+用户组合锁)。
- 延迟处理:10分钟未支付取消订单如何实现?(讨论点:MQ 延迟消息及其原理、不用 MQ 的替代方案及定时任务设计细节)。
《参考解析》
- 数据一致性对账:应采用双向对账机制,利用增量流水表记录变更。关键是保证幂等性,通过乐观锁或唯一约束(如订单号+状态)防止重复更新,并利用数据版本号或时间戳实现最终一致性。
- 秒杀系统设计:核心在于减少数据库 IO。通常采用 Redis 预扣库存(Lua 保证原子性),异步落库。资格校验应尽量前置,限制购单数应利用 Redis 的
INCR结构记录用户购买计数。 - 分布式锁:应对秒杀场景,锁粒度选择至关重要。单商品锁会导致热点阻塞,结合用户ID进行组合锁定(如
lock:goodsId:userId)可有效降低锁冲突,确保单个用户操作的原子性。 - 延迟任务:MQ 可利用死信队列或延迟插件实现。若不依赖 MQ,可采用“时间轮算法”或将订单归档到数据库中特定时间段的分区表,通过定时扫描器精确处理过期任务。