如何设计一个电商库存的秒杀
2023年2月21日大约 2 分钟电商秒杀
秒杀应该考虑哪些问题
超卖问题(首要)
高并发
秒杀具有时间短、并发量大的特点,短时间会有大量请求涌向后端
需要考虑并发过高造成缓存击穿或者失效、击垮数据库
- 接口防刷
- 秒杀Url
- 大量请求问题
系统设计与方案
前端
秒杀Url的设计
前端首先访问后端获取具体的秒杀 Url,后台校验之后才可以继续秒杀
秒杀页面静态化,扛住流量
秒杀按钮截流,禁止重复点击
设置概率,直接拒绝一部分的用户请求
后端
- 使用nginx分发请求到集群中
- 部署redis集群,采用哨兵模式
- 库存在一开始就在Redis中设值,库存的增删都在Redis中操作
- 接口限流(网关、令牌桶、Redis setNx判断是否重复下单)
- 异步下单
使用队列(本地队列、消息队列)削峰,在请求经过限流、库存等的校验之后,就可以认为是一个有效请求,就可以发送到队列进行下单操作,最终入库
Bilibili评论区
CDN边缘计算扛前端静态页面流量,设定概率,一部分用户请求直接被前端js脚本拒绝,不发请求直接显示秒杀结束。
lvs keepalive nginx集群负载均衡流量到网关集群,网关鉴权,令牌桶限流,流量一致性哈希进入redis多副本分片集群,库存拆分给redis各个节点去抢,decr命令或lua脚本原子性扣减库存,抢了之后发送消息到RocketMQ集群,返回提示订单创建中,消费者集群异步写入订单到PolarDB集群,消费成功后告知用户成功