秒杀场景
例如双11、618
涉及问题
- 高并发:时间短,瞬间用户量
- 超卖:卖出量多于库存
- 数据库超负荷:数据库甚至其他业务挂掉,导致404
设计思路
1.微服务
服务单一职责,以微服务的设计思想设计系统,每个服务职责、功能单一,并采取分布式的部署方式。每个服务建立单独的数据库。
2.缓存
- 读请求:秒杀的典型的读多写少的业务,可以利用缓存分担数据库压力
- 写请求:将数据库的库存数据转移到Redis缓存中,所有减库存的操作在Redis中进行,再通过后台进程把redis中的用户秒杀请求同步到数据库中。
- Redis集群:主从复制、读写分离、哨兵监控
- 防止超卖:利用Lua脚本(类似Redis事务,有一定的原子性,不会被其他命令插队,可以完成一些Redis事务性的操作)。把判断库存和扣减库存的操作都写在脚本中,使得库存为0后都return false
3.流量削峰
将请求放进消息队列,然后一点点的消费去修改库存,达到流量削峰的效果,防止一次性的大量请求导致服务器挂掉
4.负载均衡
拓展机器,使用Ngnix进行负载均衡,分担流量压力,同时还可拦截恶意请求。
5.限流
一旦产品卖光,前端直接秒杀结束,避免后续无效的请求