如何设计一个秒杀系统

如何设计一个秒杀系统

本篇文章会结合《大型网站技术架构》以及多篇博客来谈谈设计一个秒杀系统到底要注意哪些问题。

1. 设计难点

  1. 秒杀系统存在的场景一般是在电商网站,如果和网站其他服务部署在一起,一旦出现问题可能会对网站的其他功能造成影响,甚至全线瘫痪。所以秒杀系统应该独立部署。
  2. 参与秒杀的用户会频繁刷新页面,这会给网站的应用服务层和数据层带来并发压力。
  3. 突然增加的网络和带宽,为了避免出现网络拥塞的情况,需要临时租借网络带宽。
  4. 为了防止用户越过秒杀页面,用其他的手段获取下单URL,应该将URL做成动态生成的,在秒杀那一刻出现。

2. 应对策略

  1. 秒杀系统独立部署,一主一备提高高可用。
  2. 租用CDN服务器,将秒杀商品页面缓存在CDN上。
  3. 秒杀商品页面静态化,页面尽量精简,最好只有一个秒杀按钮存在,其他内容静态化。
  4. 动态生成随机URL。具体来说就说用一台服务器生成随机数加入URL,在秒杀到点时生成。

3. 架构设计

整体架构设计如下:
秒杀系统架构设计

  1. 用keepalive保证网关的高可用,防止反向代理服务器挂掉。
  2. 秒杀服务器集群化,支持高可用。
  3. CDN缓存静态资源。
  4. 应用缓存减少数据库压力。
  5. 数据库读写分离,多台机器用来读,其余用来写。

还需要注意的问题:对于来自同一个IP的调用应该保证幂等性,只处理秒杀时刻的一次请求,可以有效的防止秒杀软件模拟人的操作。此外页面上的按钮到点之后只能提交一次,无法重复提交。

4. 业务流程

  1. 用户下单
  2. 进入缓存队列
  3. 订单服务轮询缓存取前K个用户发送订单页面
  4. 用户付款成功则调用库存服务减库存
  5. 用户放弃支付给订单模块一个反馈,订单模块再次从缓存队列中消费任务。
  6. 继续返回第4步