秒杀业务场景设计

背景

技术:秒杀系统在各种网站和应用中经常会用到,比如:商品秒杀、活动抢购等。设计和开发一个好的秒杀系统能够从容应对蜂拥而入的流量,从而避免逢秒必死的窘境。

运营:商家可通过该款促销工具,在特定时间内设置某款商品以超低价格售卖,营造紧张的气氛,拉动人气,并引导买家买更多的东西,从而带动店铺的整体销售。

秒杀的特征

  • 低廉价格
  • 大幅推广
  • 瞬时售空
  • 一般是定时上架
  • 时间短、瞬时并发量高;

问题

  1. 高并发下数据库的压力
  2. 高并发竞争下出现超卖问题

原理

秒杀架构: 浏览器端 => 站点层 => 服务层 => 数据层
分层限流:将压力尽量集中在前端,减少数据库、服务器的压力
异步处理:异步处理防止阻塞。
可用性:高可用双活。
用户体验:隐藏购买地址,避免直接下单。
分离:主站分离。
缓存:因为读多写少,充分利用缓存

方案设计

首先要明确一个东西,秒杀本来想要少数人抢到,所有,真正到数据操作层面的量其实是很少的。

  1. 客户端

    • 产品层面,用户点击“查询”或者“购票”后,按钮置灰,禁止用户重复提交请求
    • JS层面,限制用户在x秒之内只能提交一次请求 (频率)
    • 静态文件放在cdn上
  2. 站点层面的请求拦截

    • x秒内到达站点层的请求,均返回同一页面。(uid)
    • 同一个IP地址、用户名、DeviceID等请求在一秒内不允许多次访问
    • 通过验证码等手段降低到后端数据库的压力
  3. 服务层设计

    • 活动前读取缓存库存数据
    • 写入redis
    • redis写入成功后,返回秒杀结束。
    • 三个队列,一个排队队列,一个抢购结果队列,一个库存队列。高并发下,先将用户入队到排队队列,用一个线程处理排队队列出队,判断该用户是否在抢购结果队列。如果在,则已抢购;否则,库存减1,写库,将用户入队到抢购结果队列。

常见的解决方案

  1. 数据表优化方法
    将库存字段number设置为unsigned

  2. 数据库事务优化

你可能感兴趣的:(技术)