秒杀系统设计

  • 数据库实现 乐观锁

sql

update tsec_kill
set num = num - #{buys}
where
sku = #{sku} and num - #{buys} >= 0

问题:数据库读写瓶颈

  • 缓存实现

Redis原生原子操作

系统设计

  1. 一键秒杀引导

一键秒杀引导设置后无需再结算页面输入/修改 地址 优惠 发票等元素,减少结算新再次计算和调用操作

  1. 验证码输入
  2. 下单页面防止恶意请求

下单地址动态化,动态地址再商品秒杀开始时返回给页面 防止恶意请求

  1. 秒杀库存预冻结

秒杀活动创建的时候商品库存预冻结,库存中心添加一种冻结类型

秒杀成功后直接使用改库存生成订单,订单中心增加一种秒杀订单类型

  1. 库存释放

不付款或者取消订单

一:进行库存释放,用户可以再次抢购(秒杀系统调用库存中心释放库存)

  1. 数据交互内存操作

可以使用redis 预加载数据

比如 库存计数器 用户违规操作(同ip时间内访问频率过高,同用户访问频率过高,黑名单,) Redis表的键值设置会尽量遵从最短执行/扫描路径设计

  1. 内存操作的数据对象

库存计数器 服务器节点接受的请求计数器 用户参与秒杀记录(针对 时间 商品 活动) 预生成订单vo 秒杀商品信息 访问控制数据

  1. 预加载到内存的时机

库存计数器 ---秒杀活动创建 递减

服务器节点接受的请求计数器-- 递减

用户参与秒杀记录(针对商品) -- 秒杀成功

用户参与秒杀记录(针对活动)-- 秒杀成功

用户参与秒杀记录(针对时间段)-- 秒杀成功

预生成订单vo -- 秒杀活动创建后

用户验证码 -- 用户点击 一键秒杀

秒杀商品活动信息 -- 秒杀活动创建

访问控制数据 -- 请求进入

  1. 系统隔离

第一期需要以来的模块

活动运行时依赖; 支付中心,库存中心,订单中心(库存释放)

活动开始前依赖: 商品中心, 会员中心,商家后台

  1. 秒杀库存计数器

通过Redis的原子自增锁实现 decr incr

  1. 请求的四次拦截 js处理高频点击处理限制

第一次:请求错流 验证码输入,将流量错开 减少并发

第二次:恶意流量拦截 过滤掉恶意请求 (部分)

第三次:服务节点拦截 每个服务节点允许下单的流量等于商品的库存数,其他请求提示秒杀已经抢完 到达秒杀持久化层的流量 = 服务节点数 * 库存数

第四次:到达秒杀持久层的请求数等于库存+N(N为溢出值),其他提示秒杀抢完

  1. 秒杀页面独立

该页面只调用秒杀系统,减少营销借接口的压力

  1. 秒杀成功订单持久化操作

如果持久化的量非常高 可以考虑使用消息队列来实现

猜你喜欢

转载自my.oschina.net/kipeng/blog/1629589