大型电商网站分布式秒杀系统设计三种姿势( 二 )

因此,将数据放到全国所有的 CDN 节点是不太现实的,失效问题、命中率问题都会面临比较大的挑战 。
更为可行的做法是选择若干 CDN 节点进行静态化改造,节点的选取通常需要满足以下几个条件:

  • 临近访问量集中的地区
  • 距离主站较远的地区
  • 节点与主站间网络质量良好的地区
基于以上因素,选择 CDN 的二级缓存比较合适,因为二级缓存数量偏少,容量也更大,访问量相对集中 。
这样就可以较好解决缓存的失效问题以及命中率问题,是当前比较理想的一种 CDN 化方案 。
部署方式如下图所示:
大型电商网站分布式秒杀系统设计三种姿势

文章插图
③数据整合
分离出动静态数据之后,前端如何组织数据页就是一个新的问题,主要在于动态数据的加载处理,通常有两种方案:
  • ESI 方案:Web 代理服务器上请求动态数据,并将动态数据插入到静态页面中,用户看到页面时已经是一个完整的页面 。这种方式对服务端性能要求高,但用户体验较好 。
  • CSI 方案:Web 代理服务器上只返回静态页面,前端单独发起一个异步 JS 请求动态数据 。这种方式对服务端性能友好,但用户体验稍差 。
小结:动静分离对于性能的提升,抽象起来只有两点,一是数据要尽量少,以便减少没必要的请求;二是路径要尽量短,以便提高单次请求的效率 。具体方法其实就是基于这个大方向进行的 。
热点优化热点分为热点操作和热点数据,以下分开进行讨论 。
①热点操作
零点刷新、零点下单、零点添加购物车等都属于热点操作 。热点操作是用户的行为,不好改变,但可以做一些限制保护,比如用户频繁刷新页面时进行提示阻断 。
②热点数据
热点数据的处理分三步走,一是热点识别,二是热点隔离,三是热点优化 。
热点识别:热点数据分为静态热点和动态热点 。
具体如下:
  • 静态热点:能够提前预测的热点数据 。大促前夕,可以根据大促的行业特点、活动商家等纬度信息分析出热点商品,或者通过卖家报名的方式提前筛选 。另外,还可以通过技术手段提前预测,例如对买家每天访问的商品进行大数据计算,然后统计出 TOP N 的商品,即可视为热点商品
  • 动态热点:无法提前预测的热点数据 。冷热数据往往是随实际业务场景发生交替变化的,尤其是如今直播卖货模式的兴起——带货商临时做一个广告,就有可能导致一件商品在短时间内被大量购买 。由于此类商品日常访问较少,即使在缓存系统中一段时间后也会被逐出或过期掉,甚至在 DB 中也是冷数据 。瞬时流量的涌入,往往导致缓存被击穿,请求直接到达 DB,引发 D B压力过大 。
因此秒杀系统需要实现热点数据的动态发现能力,一个常见的实现思路是:
  • 异步采集交易链路各个环节的热点 Key 信息,如 Nginx 采集访问 URL 或 Agent 采集热点日志(一些中间件本身已具备热点发现能力),提前识别潜在的热点数据 。
  • 聚合分析热点数据,达到一定规则的热点数据,通过订阅分发推送到链路系统,各系统根据自身需求决定如何处理热点数据,或限流或缓存,从而实现热点保护 。
需要注意的是:
  • 热点数据采集最好采用异步方式,一方面不会影响业务的核心交易链路,一方面可以保证采集方式的通用性 。
  • 热点发现最好做到秒级实时,这样动态发现才有意义,实际上也是对核心节点的数据采集和分析能力提出了较高的要求 。
热点隔离:热点数据识别出来之后,第一原则就是将热点数据隔离出来,不要让 1% 影响到另外的 99% 。
可以基于以下几个层次实现热点隔离:
  • 业务隔离 。秒杀作为一种营销活动,卖家需要单独报名,从技术上来说,系统可以提前对已知热点做缓存预热 。
  • 系统隔离 。系统隔离是运行时隔离,通过分组部署和另外 99% 进行分离,另外秒杀也可以申请单独的域名,入口层就让请求落到不同的集群中 。
  • 数据隔离 。秒杀数据作为热点数据,可以启用单独的缓存集群或者 DB 服务组,从而更好的实现横向或纵向能力扩展 。
当然,实现隔离还有很多种办法 。比如,可以按照用户来区分,为不同的用户分配不同的 Cookie,入口层路由到不同的服务接口中 。
再比如,域名保持一致,但后端调用不同的服务接口;又或者在数据层给数据打标进行区分等等,这些措施的目的都是把已经识别的热点请求和普通请求区分开来 。


推荐阅读