秒杀类系统设计要点

秒杀系统设计挑战
  • 用户体验和公平性。
  • 业务处理,防超卖。
  • 系统的压力挑战:
    1. 短暂的高流量,对现有网站业务造成冲击
    2. 高并发,数据库高负载
    3. 网络及服务器带宽增长压力
    4. 业务逻辑的简化
 
秒杀系统的解决策略
  • 公平保证:
    1. 秒杀用户筛选策略: 一般是先到先得,10个商品放100个人进来
    2. 防秒杀器和机器人: 验证码等手段
  • 系统压力:
    1. 秒杀系统独立部署,避免对主站造成压力和堵死
    2. 秒杀商品页面静态化和缓存化,减少后端请求
    3. 租借秒杀活动网络带宽
 
关键点
  • 业务拆分,独立并发访问
  • 高并发控制,请求量拦截。
  • 读写分离(查询库存和下订单拆分独立)
  • 请求队列控制接受数,从而控制并发量
  • 订单和支付的一致性
 
系统层级的划分:     前端 -> web层 -> 业务服务 -> DB持久层
 
 
前端
       A:扩容,加机器,这是最简单的方法,通过增加前端池的整体承载量来抗峰值。
       B:静态化,将活动页面上的所有可以静态的元素全部静态化,并尽量减少动态元素。通过CDN来抗峰值。
       C:限流一般都会采用IP级别的限流,即针对某一个IP,限制单位时间内发起请求数量。
 
web层
      A:   集群负载均衡,节点能线性扩展。
      B:采用短连接,连接池。
 
业务服务
          A:查询模块(查询库存)并发查询,库存数存在缓存中,(商品信息和图片信息等等)静态化处理和库存剩余数量缓存化处理。
          B: 下订单模块(秒杀关键部分),队列控制异步化处理,首先判断这个队列是否已满, 如果没满就将请求放入队列中排队,队列满以后的所有请求直接返回秒杀失败。
          C: 支付模块,异步付款,等待付款成功结果。(付款成功更新库存,也可下单的时候扣库存)。
 
DB持久层
 
A: 各个系统的业务数据分库存储,主从读写分离,单个子系统的数据,可以通过分库/分表的方法。
B: 构建合理数据库索引,如对购买记录添加唯一索引,数据更新检测库存,如update number set x=x-1 where (x -1 ) >= 0。
 
 
监控系统
A: 操作系统的cpu, memory,i/o 。
B: 各个系统的log:访问次数,warning, error log的条数。
C: dba对数据库的监控。
D: 业务层面的监控:每分钟各个子系统的交易量(DB查询)。
E: 核心路径监控,非常重要的部分,单笔请求在交易系统中的流程,一笔实时交易,从接收到http请求,到各个子系统之间的互相访问,到DB的读写,到返回抢购结果。
 
 
 
本文主要是对秒杀类系统设计需要考虑的要点进行记录,当然具体设计该类系统时,需要依据业务的访问特性及规模,合理设计。本文主要参考了《秒杀系统设计与优化》
 
 
小米抢购抢购系统设计:http://www.csdn.net/article/2014-11-07/2822545
 
posted @ 2015-11-08 18:24  snailding  阅读(2170)  评论(0编辑  收藏  举报