详解淘宝大秒杀系统设计,首次公开
目录
1. 一些数据
2. 热点隔离
3. 动静分离
4. 基于时间分片削峰
5. 数据分层校验
6. 实时热点发现
7. 关键技术优化点
7.1 Java处理大并发动态请求优化
7.2 同一商品大并发读问题
7.3 同一数据大并发更新问题
8. 大促热点问题思考
1. 一些数据
大家还记得2013年的小米秒杀吗?三款小米手机各11万台开卖,走的都是大秒系统,3分钟后成为双十一第一家也是最快破亿的旗舰店。经过日志统计,前端系统双11峰值有效请求约60w以上的QPS ,而后端cache的集群峰值近2000w/s、单机也近30w/s,但到真正的写时流量要小很多了,当时最高下单减库存tps是红米创造,达到1500/s。
2. 热点隔离
- 业务隔离。把秒杀做成一种营销活动,卖家要参加秒杀这种营销活动需要单独报名,从技术上来说,卖家报名后对我们来说就是已知热点,当真正开始时我们可以提前做好预热。
- 系统隔离。系统隔离更多是运行时的隔离,可以通过分组部署的方式和另外99%分开。秒杀还申请了单独的域名,目的也是让请求落到不同的集群中。
- 数据隔离。秒杀所调用的数据大部分都是热数据,比如会启用单独cache集群或MySQL数据库来放热点数据,目前也是不想0.01%的数据影响另外99.99%。
3. 动静分离
除此之外还有如下特点:
把整个页面Cache在用户浏览器
如果强制刷新整个页面,也会请求到CDN
实际有效请求只是“刷新抢宝”按钮
4. 基于时间分片削峰
除了在前端通过答题在用户端进行流量削峰外,在服务端一般通过锁或者队列来控制瞬间请求。
5. 数据分层校验
对大流量系统的数据做分层校验也是最重要的设计原则,所谓分层校验就是对大量的请求做成“漏斗”式设计,如图3所示:在不同层次尽可能把无效的请求过滤,“漏斗”的最末端才是有效的请求,要达到这个效果必须对数据做分层的校验,下面是一些原则:
- 先做数据的动静分离
- 将90%的数据缓存在客户端浏览器
- 将动态请求的读数据Cache在Web端
- 对读数据不做强一致性校验
- 对写数据进行基于时间的合理分片
- 对写请求做限流保护
对写数据进行强一致性校验
秒杀系统正是按照这个原则设计的系统架构,如图4所示。
把大量静态不需要检验的数据放在离用户最近的地方;在前端读系统中检验一些基本信息,如用户是否具有秒杀资格、商品状态是否正常、用户答题是否正确、秒杀是否已经结束等;在写数据系统中再校验一些如是否是非法请求,营销等价物是否充足(淘金币等),写的数据一致性如检查库存是否还有等;最后在数据库层保证数据最终准确性,如库存不能减为负数。
6. 实时热点发现
- 构建一个异步的可以收集交易链路上各个中间件产品如Tengine、Tair缓存、HSF等本身的统计的热点key(Tengine和Tair缓存等中间件产品本身已经有热点统计模块)。
- 建立一个热点上报和可以按照需求订阅的热点服务的下发规范,主要目的是通过交易链路上各个系统(详情、购物车、交易、优惠、库存、物流)访问的时间差,把上游已经发现的热点能够透传给下游系统,提前做好保护。比如大促高峰期详情系统是最早知道的,在统计接入层上Tengine模块统计的热点URL。
- 将上游的系统收集到热点数据发送到热点服务台上,然后下游系统如交易系统就会知道哪些商品被频繁调用,然后做热点保护。如图5所示。
图5 实时热点数据后台
- 这个热点服务后台抓取热点数据日志最好是异步的,一方面便于做到通用性,另一方面不影响业务系统和中间件产品的主流程。
- 热点服务后台、现有各个中间件和应用在做的没有取代关系,每个中间件和应用还需要保护自己,热点服务后台提供一个收集热点数据提供热点订阅服务的统一规范和工具,便于把各个系统热点数据透明出来。
- 热点发现要做到实时(3s内)。
7. 关键技术优化点
7.1 Java处理大并发动态请求优化
- 直接使用Servlet处理请求。避免使用传统的MVC框架也许能绕过一大堆复杂且用处不大的处理逻辑,节省个1ms时间,当然这个取决于你对MVC框架的依赖程度。
- 直接输出流数据。使用resp.getOutputStream而不是resp.getWriter可以省掉一些不变字符数据编码,也能提升性能;还有数据输出时也推荐使用JSON而不是模板引擎(一般都是解释执行)输出页面。
7.2 同一商品大并发读问题
- 像商品中的标题和描述这些本身不变的会在秒杀开始之前全量推送到秒杀机器上并一直缓存直到秒杀结束。
- 像库存这种动态数据会采用被动失效的方式缓存一定时间(一般是数秒),失效后再去Tair缓存拉取最新的数据。
7.3 同一数据大并发更新问题
- 应用层做排队。按照商品维度设置队列顺序执行,这样能减少同一台机器对数据库同一行记录操作的并发度,同时也能控制单个商品占用数据库连接的数量,防止热点商品占用太多数据库连接。
- 数据库层做排队。应用层只能做到单机排队,但应用机器数本身很多,这种排队方式控制并发仍然有限,所以如果能在数据库层做全局排队是最理想的,淘宝的数据库团队开发了针对这种MySQL的InnoDB层上的patch,可以做到数据库层上对单行记录做到并发排队,如图6所示。
你可能会问排队和锁竞争不要等待吗?有啥区别?如果熟悉MySQL会知道,InnoDB内部的死锁检测以及MySQL Server和InnoDB的切换会比较耗性能,淘宝的MySQL核心团队还做了很多其他方面的优化,如COMMIT_ON_SUCCESS和ROLLBACK_ON_FAIL的patch,配合在SQL里面加hint,在事务里不需要等待应用层提交COMMIT而在数据执行完最后一条SQL后直接根据TARGET_AFFECT_ROW结果提交或回滚,可以减少网络的等待时间(平均约0.7ms)。据我所知,目前阿里MySQL团队已将这些patch及提交给MySQL官方评审。
8. 大促热点问题思考
- 数据访问热点,比如Detail中对某些热点商品的访问度非常高,即使是Tair缓存这种Cache本身也有瓶颈问题,一旦请求量达到单机极限也会存在热点保护问题。有时看起来好像很容易解决,比如说做好限流就行,但你想想一旦某个热点触发了一台机器的限流阀值,那么这台机器Cache的数据都将无效,进而间接导致Cache被击穿,请求落地应用层数据库出现雪崩现象。这类问题需要与具体Cache产品结合才能有比较好的解决方案,这里提供一个通用的解决思路,就是在Cache的client端做本地Localcache,当发现热点数据时直接Cache在client里,而不要请求到Cache的Server。
- 数据更新热点,更新问题除了前面介绍的热点隔离和排队处理之外,还有些场景,如对商品的lastmodifytime字段更新会非常频繁,在某些场景下这些多条SQL是可以合并的,一定时间内只执行最后一条SQL就行了,可以减少对数据库的update操作。另外热点商品的自动迁移,理论上也可以在数据路由层来完成,利用前面介绍的热点实时发现自动将热点从普通库里迁移出来放到单独的热点库中。
按照某种维度建的索引产生热点数据,比如实时搜索中按照商品维度关联评价数据,有些热点商品的评价非常多,导致搜索系统按照商品ID建评价数据的索引时内存已经放不下,交易维度关联订单信息也同样有这些问题。这类热点数据需要做数据散列,再增加一个维度,把数据重新组织。
正文结束
1.
2.
3.
4.
5.
6.
7.
8.
一个人学习、工作很迷茫?
点击「阅读原文」加入我们的小圈子!
详解淘宝大秒杀系统设计,首次公开相关推荐
- 你了解淘宝大秒杀系统设计详解吗?
1. 一些数据 2. 热点隔离 3. 动静分离 4. 基于时间分片削峰 5. 数据分层校验 6. 实时热点发现 7. 关键技术优化点 7.1 Java处理大并发动态请求优化 7.2 同一商品大并发读问 ...
- 淘宝大秒杀系统设计详解
摘要:最初的秒杀系统的原型是淘宝详情上的定时上架功能,由于有些卖家为了吸引眼球,把价格压得很低.但这给的详情系统带来了很大压力,为了将这种突发流量隔离,才设计了秒杀系统,文章主要介绍大秒系统以及这种典 ...
- Java程序员,你了解淘宝大秒杀系统设计详解吗?
1. 一些数据 大家还记得2013年的小米秒杀吗?三款小米手机各11万台开卖,走的都是大秒系统,3分钟后成为双十一第一家也是最快破亿的旗舰店.经过日志统计,前端系统双11峰值有效请求约60w以上的QP ...
- Java编程详细解析—淘宝大秒杀系统是如何设计的?
2019独角兽企业重金招聘Python工程师标准>>> 摘要 最初的秒杀系统的原型是淘宝详情上的定时上架功能,由于有些卖家为了吸引眼球,把价格压得很低.但这给的详情系统带来了很大压力 ...
- 详解淘宝直播背后的技术
在移动网络.云计算.人工智能等技术发展的驱动下,直播成为当今时代的一个电商新物种.而该领域发展至今,无论是从量级上,还是技术上,作为行业中的佼佼者--淘宝直播,一直以来,都备受技术人的关注. 在阿里文 ...
- 详解淘宝直播背后的技术!
在移动网络.云计算.人工智能等技术发展的驱动下,直播成为当今时代的一个电商新物种.而该领域发展至今,无论是从量级上,还是技术上,作为行业中的佼佼者--淘宝直播,一直以来,都备受技术人的关注. 在阿里文 ...
- 十二张图详解淘宝架构变迁
创立之初,为了快速上线,抢占市场,淘宝选择了当时流行的LAMP架构,用PHP作为网站开发语言, Linux作为操作系统,Apache作为Web服务器,MySQL为数据库,用了三个月不到的时间淘宝就上线 ...
- 淘宝网秒杀需求分析与实现 - 公开课笔记
主要内容 高并发系统架构面试的时候被问到该怎么说? 一个高并发系统中有哪些重要指标项? 从真实需求触发拆解淘宝网秒杀系统 - 消息中间件解耦.消峰.限流 分布式锁,限流,熔断,分布式事务,阿里云动态扩 ...
- python+selenium+chrome实现淘宝购物车秒杀自动结算
python+selenium+chrome实现淘宝购物车秒杀自动结算 一.所需环境 二.安装 三.代码 最后run()一把就ok了!! 之前总是想要买aj,但是淘宝店铺每次发售手动抢的时候一般都会被 ...
- 基于python实现淘宝协议秒杀程序
前言: 最近太忙了,今天下午得空半小时更新一下博客.今天为大家带来的是某宝秒杀破解教程,因为双十一块到了,也是我最近写的一个小软件,这个协议请求的代码不会给的,但是web自动化的可以在我的github ...
最新文章
- python中的元类_python中的元类
- 计算机应用基础第三章操作步骤,最新江西三校生计算机应用基础模拟操作题集锦(超实用!)...
- Android之ListView的getItemViewType和getViewTypeCount
- ​NVIDIA针对数据不充分数据集进行生成改进,大幅提高CIFAR-10数据生成
- Lunar New Year and Cross Counting
- Android之自定义 ActionBar 上的菜单(Menu)文字颜色
- mysql for update用处_for update的作用和用法
- 重温JS基础--创建对象
- PPT,要你好看(全彩)pdf
- 【渝粤教育】国家开放大学2019年春季 1248公共部门人力资源管理 参考试题
- 获取Android包名和activity名
- poj 1125 Floyd简单
- 【C++】:动态库与静态库区别
- matlab输出以下图形,输出高品质MATLAB图形的方法与技巧_陈丽安.pdf
- 老挑毛 win7 linux,老挑毛u盘装系统步骤|老挑毛u盘一键装系统
- C# 每天定时执行任务(每天凌晨1点执行)
- window 开启 Telnet 客户端
- C 语言回调函数详解
- Category 的理解
- ISO:31000-2018 Risk Management-Guideline读书笔记