秒杀笔记 —— 二八原则

秒杀笔记 —— 二八原则

有针对性的处理好系统的“热点数据”,结合“二八原则”举例说明秒杀场景的处理思想。

认识“热点”

电商平台,经常被访问的商品统称为 “热点商品”;
这些商品在很短的时间内被大量用户执行访问、添加购物车、下单等操作,这些操作成为 热点操作;

为什么关注热点

有用的请求或者无用的请求都有可能成为热点请求,热点请求占用服务器资源较大(在某些活动或者,更甚者被攻击的情况下),为了保证服务器的高可用稳定,我们一定要关注热点。

什么是热点

热点分为“热点操作”和“热点数据”

  • 热点操作
    大量页面刷新、大量添加购物车、双十一零点大量下单等此类操作都是热点操作。系统把这些操作认为是“读请求”与“写请求”。
    读请求优化:可以通过缓存,动静分离等方式进行优化,优化手段方法较多。
    写请求优化:瓶颈通常在存储层,思路 根据CAP理论 进行扩展。CAP相对论

  • 热点数据
    用户的热点请求对应的数据即是热点数据。热点数据又被分为“静态热点数据”和“动态热点数据。”

标题 描述
静态热点数据 能够提前预测是热点数据
1. 卖家报名方式提前筛选,通过报名系统提前标记。
2. 通过一段时间的运营数据(购物车记录、成交记录、下单记录等)基于大数据分析系统分析出可能成为热点的数据。
动态热点数据 不能被提前预测的数据
例如:买家在某流量较大的平台做了广告,突然访问剧增,此商品成为了热点商品。

发现“热点”

因为我们主要讲的是“秒杀”场景,我们可以认为 “参加秒杀的商品就是秒杀商品”,这固然正确,但是我们如何来确认这些商品就是热点数据呢。

发现静态热点数据

1. 卖家报名参加方式提交把热点商品获取,通过后台管理端对这些商品处理,例如添加缓存(redis)。
2. 也可以通过每天商品访问记录,获取Top N Product,这些Top N Product我们可以认为是热门数据。
缺点:实时性较差。

发现动态热点数据

动态热点发现系统具体实现

扫描二维码关注公众号,回复: 5535637 查看本文章
  • 构建一个异步系统
    收集交易链路上各个环节中的中间件产品热点Key,如Nginx、缓存、RPC服务框架等这些中间件(有的中间件自带热点统计模块)。
  • 建立热点上报、按照需求订阅热点服务下发规范
    通过交易链上各个系统(包括详情、购物车、交易、优惠、库存、物流等)访问的时间差,把上游已发现热点透传至下游系统,提前做好保护。
    例如:大促高峰期,详情系统最早知道,统一接入层Nginx模块统计的热点URL。
  • 收集保护
    上游系统收集的热点数据发送到热点服务台,下游系统(如交易系统)会知道哪个系统频繁调用,然后做热点保护。

如下图所示:用户请求商品,虽然经过了很多路径,但是我们主要依赖前面的导购页(包括首页、搜索页面、商品详情、购物车等)提前识别哪些商品访问高,通过这些系统中的中间件收集热点数据,并记录日志。
在这里插入图片描述
通过上游没台机器配置的Agent把日志汇总到聚合和分析集群中,把符合一定规则的热点,通过订阅分发系统再推送到对应到系统。可以把热点数据填充到Cache中,或者直接推送到应用服务器的内存中,还可以对这些数据进行拦截,下游系统可以订阅这些数据,然后根据需求处理这里数据

打造热点发现系统的注意事项:

  • 热点服务后台抓去数据应采用异步方式。
  • 热点服务发现和中间件自身的热点保护模块并存,每个中间件和应用还要保护自己。热点服务台提供热点数据的收集和订阅服务,便于把各个系统的热点数据透明出来。
  • 热点发现要做到接近实时(3s内完成热点数据发现),实时发现才能及时的对下游系统提供保护。

处理“热点”

热点处理思路分为:优化、限制、隔离

优化

优化热点数据,最有效的就是 缓存热点数据, 如果热点数据做了动静分离,那么可以长期缓存静态数据。但是,缓存热点 数据更多的 是“临时”缓存用一个队列短暂缓存数秒钟,由于队列长度有限,可采用LRU淘汰算法替换。

限制

限制 更多的 是一种保护机制, 限制的方式有很多,例如对访问对商品ID做一致性Hash,然后根据Hash做分桶,每个分桶设置一个处理队列,这样可以把热点商品限制在一个请求队列里,防止因某些热点商品占用太多服务器资源,避免其他请求没有资源可用。

隔离

秒杀系统设计第一原则即是将这种热点数据隔离出来,不让1%请求影响另外99%请求。隔离后更方便对1%请求做针对性优化。

具体“秒杀”业务,可以在以下几个层次实现隔离:

  • 业务隔离
    把秒杀做成一种营销活动,参加秒杀活动需要单独报名。技术上,卖家报名后就有了已知热点,因此可以提前预热。
  • 系统隔离
    系统隔离更多是运行时隔离,可以通过分组布署方式与另外99%分开。 秒杀可以申请单独域名,目的是让请求落到不同的集群中。
  • 数据隔离
    秒杀调用数据大部分是热点数据,比如启用单独的Cache集群或者MySql数据库来放热点数据,目的也是不想0.01%的数据有机会影响99.99%数据。

令牌桶实现方式(待完善)
Gateway实现请求拦截,并保存到MongoDB,作为热点分析数据(待完善)
Nginx Redis调用(待完善)

猜你喜欢

转载自blog.csdn.net/Cy_LightBule/article/details/87984531