#青训营笔记创作活动#

2月9日 打卡day28

今日学习 秒杀系统设计

(又是一片秒杀系统, 十分经典的场景设计)

特点
- 瞬时流量高
- 读多写少
- 实时性要求高

解决思路
1. 页面静态化: 避免刷新页面的请求频繁消耗后端接口资源
2. CDN加速: 将前端资源缓存到CDN服务器上, 提升访问速率
3. 缓存: 商品详情信息缓冲到redis中
- 缓存击穿: 大量请求到来, 且redis没有保存商品信息, 则会将流量导入到数据库中, 将数据库击穿. 解决: 需要使用分布式锁, 保证同一商品详情, 只有一次请求
- 缓存穿透: 非法请求传入不存在的商品id, 此时redis没有缓存, 需要一直访问数据库. 解决: 布隆过滤器, 过滤不存在id
- 缓存雪崩: 缓存在同一段时间内一起到期, 流量又进入数据库. 解决: 随机过期时间, 定期更新缓存
4. mq异步处理
- 消息丢失: 加入消息发送表+job重试
- 重复消费: 消费处理表
- 垃圾消息: 设置重试上限
- 延迟消息实现未支付订单超时
5. 限流
6. 分布式锁
查询商品信息时, 防止多余数据库访问, 使用redis添加分布式锁
7. 库存:
下单接口采用redis减库存+mq异步生成订单
为保证redis减库存的原子性(查询剩余库存+减库存), 使用lua脚本操作redis
减redis库存完成后, 放入mq中, 开启订单消费服务生成订单 (如果需要秒杀成功后实时查询订单, 可以考虑生成令牌, 用户查询时传入令牌, 提前消费)

[高并发下秒杀商品,你必须知道的9个细节 - 掘金 (juejin.cn)](juejin.cn)
展开
评论