如何设计秒杀系统?
遇到的问题
- 高并发
单机Redis只能顶得住3-4W的 QPS
短时间大量用户访问,可能造成的缓存雪崩,缓存击穿,缓存穿透问题
- 超卖
- 恶意请求
黄牛,脚本模拟请求
- 链接暴露
提前往后台路径发请求
- 数据库
每秒上万甚至十几万的 QPS 打到数据库,基本会打挂掉,如果没有做降级、限流、熔断,别的服务一起挂,小公司可能全站 404
如何设计解决
- 服务单一指责
微服务的设计思想+分布式部署的方式:给秒杀也单独开一个服务,将相关业务逻辑代码放一块
分库:单独建立一个数据库
表设计:该索引的地方设置索引,建完后记得用 explain 看看 SQL 的执行计划
- 秒杀链接加盐
URL 动态化:通过 MD5 之类的加密算法加密随机字符串做 url,通过前端代码获取 url 后台校验才能通过
- Redis 集群
主从同步、读写分离,搞点哨兵,开启持久化高可用
- Nginx
高性能 web 服务器,负载均衡
- 资源静态化
把能提前放入CDN 服务器的东西放进去,秒杀时减少服务器压力
- 按钮控制
秒杀前置灰
- 限流
前端限流:点一下或两下几秒后才可以继续点,保护服务器
后端限流:卖完产品,后端也关闭后续无效请求的介入
Tip:真正的限流还会加入 Sentinel、Hystrix
- 库存预热
秒杀前,通过定时任务或者运维提前把商品库存加载 Redis 中,等秒杀流程结束,再异步修改库存
但是,高并发下会产生问题,需要用到 Lua
- Lua
类似 Redis 事务,有一定的原子性
- 限流&降级&熔断&隔离
限流:顶不住就挡一部分出去,但是不能说不行
降级:降级了还是被打挂了 ↓
熔断:至少不影响别的系统
隔离:快影响了别拖累兄弟们
- 削峰填谷
MQ,秒杀一万个,服务器挂了咋办?
业务量级达不到也没关系,以后公司体量上去了不用改代码
总结

怎样学习获得“高并发”经验?
电商剖解

