秒杀类系统设计要点
秒杀系统设计挑战
- 用户体验和公平性。
- 业务处理,防超卖。
- 系统的压力挑战:
- 短暂的高流量,对现有网站业务造成冲击
- 高并发,数据库高负载
- 网络及服务器带宽增长压力
- 业务逻辑的简化
秒杀系统的解决策略
- 公平保证:
- 秒杀用户筛选策略: 一般是先到先得,10个商品放100个人进来
- 防秒杀器和机器人: 验证码等手段
- 系统压力:
- 秒杀系统独立部署,避免对主站造成压力和堵死
- 秒杀商品页面静态化和缓存化,减少后端请求
- 租借秒杀活动网络带宽
关键点
- 业务拆分,独立并发访问
- 高并发控制,请求量拦截。
- 读写分离(查询库存和下订单拆分独立)
- 请求队列控制接受数,从而控制并发量
- 订单和支付的一致性
系统层级的划分: 前端 -> 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://mm.fancymore.com/reading/%E7%A7%92%E6%9D%80%E7%B3%BB%E7%BB%9F%E7%9A%84%E8%AE%BE%E8%AE%A1.html
随时保持记录,保持总结,保持反思