- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
【营销架构day3】淘宝:怎么设计一个秒杀系统
1. 一些数据
大家还记得 2013 年的小米秒杀吗?三款小米手机各 11 万台开卖,走的都是大
秒系统,3 分钟后成为双十一第一家也是最快破亿的旗舰店。经过日志统计,
前端系统双 11 峰值有效请求约 60w 以上的QPS ,而后端 cache 的集群峰值近
2000w/s、单机也近 30w/s,但到真正的写时流量要小很多了,当时最高下单减
库存 tps 是红米创造,达到 1500/s。
2. 热点隔离
秒杀系统设计的第一个原则就是将这种热点数据隔离出来,不要让 1%的请求影
响到另外的 99%,隔离出来后也更方便对这 1%的请求做针对性优化。针对秒杀
我们做了多个层次的隔离:
• 业务隔离。把秒杀做成一种营销活动,卖家要参加秒杀这种营销活动需
要单独报名,从技术上来说,卖家报名后对我们来说就是已知热点,当
真正开始时我们可以提前做好预热。
• 系统隔离。系统隔离更多是运行时的隔离,可以通过分组部署的方式和
另外 99%分开。秒杀还申请了单独的域名,目的也是让请求落到不同的
集群中。
• 数据隔离。秒杀所调用的数据大部分都是热数据,比如会启用单独
cache 集群或 MySQL 数据库来放热点数据,目前也是不想 0.01%的数据影
响另外 99.99%。
当然实现隔离很有多办法,如可以按照用户来区分,给不同用户分配不同
cookie,在接入层路由到不同服务接口中;还有在接入层可以对 URL 的不同
Path 来设置限流策略等 。服务层通过调用不同的服务接口;数据层可以给数据
打上特殊的标来区分。目的都是把已经识别出来的热点和普通请求区分开来。
3. 动静分离
前面介绍在系统层面上的原则是要做隔离,接下去就是要把热点数据进行动静
分离,这也是解决大流量系统的一个重要原则。如何给系统做动静分离的静态
化改造我以前写过一篇《高访问量系统的静态化架构设计》详细介绍了淘宝商
品系统的静态化设计思路,感兴趣的可以在 《程序员》杂志上找一下。我们的
大秒系统是从商品详情系统发展而来,所以本身 已经实现了动静分离,如图
1。
图 1 大秒系统动静分离
除此之外还有如下特点:
• 把整个页面 Cache 在用户浏览器
• 如果强制刷新整个页面,也会请求到 CDN
• 实际有效请求只是 “刷新抢宝 ”按钮
这样把 90%的静态数据缓存在用户端或者 CDN 上,当真正秒杀时用户只需要点
击特殊 的按钮 “刷新抢宝 ”即可,而不需要刷新整个页面,这样只向服务端请
求很少的有效数据,而不需要重复请求大量静态数据。秒杀的动态数据和普通
的详情页面的动态数据相 比更少,性能也比普通的详情提升 3 倍 以上。所以
“刷新抢宝 ”这种设计思路很好地解决 了不刷新页面就能请求到服务端最新的
动态数据。
4. 基于时间分片削峰
熟悉淘宝秒杀的都知道,第一版的秒杀系统本身并没有答题功能,后面才增加
了秒杀答题,当然秒杀答题一个很重要的目的是为了防止秒杀器,2011 年秒杀
非常火的时候,秒杀器也比较猖獗,而没有达到全民参与和营销的目的,所以
增加的答题来限制秒杀器 。增加答题后,下单的时间基本控制在 2s 后,秒杀器
的下单比例也下降到 5%以下。新的答题页面如图 2。
图 2 秒答题页面
其实增加答题还有一个重要的功能,就是把峰值的下单请求给拉长了,从以前
的 1s 之内延长到 2~10s 左右,请求峰值基于时间分片了,这个时间的分片对服
务端处理并发非常重要,会减轻很大压力,另外由于请求的先后,靠后的请求
自然也没有库存了,也根本到不了最后的下单步骤,所以真正的并发写就非常
有限了。其实这种设计思路目前也非常普遍,如支付宝的 “咻一咻”已及微信
的摇一摇 。
除了在前端通过答题在用户端进行流量削峰外,在服务端一般通过锁或者队列
来控制瞬间请求。
5. 数据分层校验
图 3 分层校验
对大流量系统的数据做分层校验也是最重要的设计原则,所谓分层校验就是对
大量的请求做成 “漏斗 ”式设计,如图 3 所示:在不同层次尽可能把无效的请
求过滤, “漏斗 ”的最末端才是有效的请求,要达到这个
文档评论(0)