秒杀设计流程及难点
3、限流机制
方式:ip限流、接口令牌限流、用户限流、header动态token(前端加密,后端解密)
4、分布式锁
方式:
setnx + expire (非原子性,redis2.6 之后set保证原子性)
释放锁超时 (开启守护进程自动续时间)
过期锁误删其他线程(requestId验证或者lua脚本保证查 + 删的原子性)
5、缓存数据
方式:
缓存击穿:缓存数据预热 + 布隆过滤器/空缓存
缓存雪崩:缓存设置随机过期时间,防止同一时间过期
6、库存及订单
扣库存
redis 自减库存,并发场景下可能导致负数,影响库存回仓:使用lua脚本保证原子性
redis预扣库存之后,然后使用异步消息创建订单并更新库存变动
数据库更新库存使用乐观锁:where stock_num - sell_num > 0
添加消息发送记录表及重试机制,防止异步消息丢失
创建订单
前端建立websocket连接或者轮询监听订单状态
回仓
创建订单之后发送延时消息,验证订单支付状态及库存是否需要回仓