2017年双十一即将来临,对于买家来说是一年一度的购物狂欢,可是对于电商公司的技术人员来说,却是一年一次的大考。如何用更少的预算完成指定当前业务规模的流量高峰,是技术的永恒主题。

\\

由InfoQ举办的ArchSummit全球架构师峰会即将于12月8-11日北京举行,大会与阿里巴巴合作策划了双11架构专场,并邀请了顶级技术专家担任出品人,设置了“新一代DevOps”、“人工智能与业务应用”、“架构升级与优化”等17个热门话题,目前大会日程已出,欢迎前来讨论交流。

\\

有赞在双十一之前完成了全链路压测方案,并把它用于大促的扩容和容量验证,取得了不错的成果。

\\

在电商公司待过的技术同学都知道,在大促来临时,整个集群的最高峰压力将是正常时间的几十倍,最高峰持续的时间会特别短,然后回落到正常水平的几倍。所以,我们可能会自然而然地想到,把整个集群扩容几十倍的机器,在双十一当天应对几十倍的流量,然后第二天减至正常量,就可以完成大促的考验。事实情况是否真的这么简单?

\\

大促保障的困难

\\

用户购买商品的链路是一条很长很复杂的系统集群,中间会涉及到店铺、商品、会员、营销、交易、支付等6大核心模块,每个模块又会涉及到多个不同的服务化系统单元,我们把这一条骨干的链路就叫做核心链路。

\\

大家都知道,双十一当天,真正爆增的其实是买家的购买量,像开店/商品上架等功能,其实并发量没什么变化。也就是说,真正的压力其实是在核心链路上面,如果把所有的系统都扩容几十倍,本身就是一个很大的浪费。正常来说,一个稍有规模的电商公司,日常有几千台机器维持正常的运转,本身就是一个较大的开销,如果突增几十倍的系统开销,对于公司的财务也是很大的压力。所以,一个较理想的方法,是只把核心链路的系统扩大几十倍的系统吞吐量,就可以达到目标。

\\

困难一

\\

大型的分布式系统其实错综复杂,公司需要维持成百上千的服务化系统。理论上来说, 只有少部分系统是核心链路的系统。但是在实际情况下,因为公司人员的关系,可能会把某些非核心系统,不知不觉加入到了核心链路中。所以,第一件要做的事情,就是把非核心系统从核心链路上剔除。

\\

困难二

\\

一般公司都会在线下搭建性能测试环境,在该环境下,我们的测试同学可 以借助一些测试工具,去压单机单接口的性能。假如,店铺的首页面,我们在性能测试环境下,得出单机单接口的QPS峰值是500,这是否意味着, 要达到10w的QPS,我只需要设置200台机器就可以了呢?答案当然是否定的。因为任何的页面接口都不是单独存在的,都会受到公共资源的制约,如:DB、Redis、MQ、网络带宽等。比如当店铺首页达到10w QPS的时候,商品详情页可能要达到8w的QPS了,也会消耗公共资源。当公共资源的能力下降时,势必会影响所有的系统。所以,通过单机性能算出来的理论值,跟实际情况会相差很远。

\\

困难三

\\

正常来说,任何大促都会有业务目标,这个目标一般是拿GMV进行评估。但是我们在进行系统容量评估的时候,一般会想扩大多少台机器。那么GMV跟核心链路各个系统之间的机器数量的转化关系是什么样的?

\\

困难四

\\

做过大型分布式系统的同学,可能都知道一个事实,即整个集群的性能其实取决于接口的短板效应。而这个短板的接口,在正常的流量下,是不会显现出来的。只有集群的整体压力达到一定值的情况下,才会偶尔显现, 然后造成雪崩效应,拖累整个系统集群。所以,如何在大促之前找到这些短板,然后把它们一个一个优化,这件事情就显得非常重要。

\\

困难五

\\

应用系统的扩容相对而言是比较简单的,完成大促之后,可以很容易归还。但是DB等核心资源的扩容其实并不容易,而且资源不可能归还(数据不不可丢失)。

\\

事实是检验真理理的唯⼀一标准,上面提到的五个困难,其实都可以用线上真实压测的办法去检验。业内大型电商公司,会用全链路压测的方案去指导扩容的进程,有赞也不例外。今年双十一,有赞用该方案完成了对核心链路20倍的扩容,但是整个集群的规模只是扩大了了一倍多一点。

\\

有赞全链路压测的设计方案

\\

全链路压测的目标是让双十一要发生的事情提前发生,并验证在该情况下系统表现良好。做线上压测,有一个很重要的原则:线上系统是不允许有脏数据的。

\\

有赞的压测设计方案,可以用几句简单的话做概括:

\\

  • 压测流量落影子库,正常流量落正常库。\\t
  • 压测不能把系统压崩溃。\\t
  • 压测是模拟双十一流量最高峰时用户的购物行为,所以综合性的流量模型需要跟实际情况相符。\

全链路压测的总体设计

\\

有图有真相,我们先上图。

\\

\\

在上述图中,我们明显可以看到,全链路压测有几个关键部分:

\\

  1. 数据工厂,负责造请求数据。\\t
  2. 大流量下发器,产生很大的压力去压系统。\\t
  3. 线上服务集群同时处理压测请求+正常请求。\\t
  4. 压测流量落影子存储,正常流量落正常存储。\\t
  5. 压测流量对于外部的依赖走mock服务器,正常流量走正常外部集群。\\t
  6. 水位检测,需要检测存储+线上应用服务器的健康度,并且能够干预流量下发。\

关键模块的设计方案

\\

数据工厂设计

\\

\\

数据工厂是压测的一个核心部件,主要由Hive表的集合+各种导入、导出脚本组成。

\\

数据工厂的目的是保存压测需要准备的所有数据,数据需要做清洗,比如:

\\

  • 商品未下架\\t
  • 商品的库存无限\\t
  • 营销活动的信息有效,未过期\\t
  • 店铺未关闭等等\

场景的定义:场景的定义关系到数据的准备,正常来说,压测只会压随着买家人数暴增、系统的压力立即增加的场景,我们把这个场景涉及到的系统叫做“核心链路”。

\\

影子存储的设计与路由能力

\\

  1. DB、路由方式由RDS提供,存储可以有两种方式:\\t

    • 影子表与正常表存在同样的instance、不同的schema中。这个方案不需要增加额外的存储开销,相对更便宜,但是风险较高(把库压死了会影响线上业务)。\\t\t
    • 影子表与正常表存在不同的instance、相同的schema中。这个方案相对较贵,需要额外搭建DB集群,但是安全性较高。\\t

    我们选择的是第一个方案。

    \\t\\t

  2. Redis:通过key值来区分。压测流量的key值加统一前缀,通过Redis-Client做路由。\\t
  3. HBase:通过命名空间做隔离。影子空间加前缀,提供统一的HBase Client做数据访问,由该Client做路由。\\t
  4. ES:通过index名字来区分。影子的索引统一加前缀,提供统一的ES Client做数据访问,由该Client做路由。\

线上应用集群的变更

\\

  1. 统一线上应用对于数据的访问(DB+ES+HBase+Redis),提供统一的Client。\\t
  2. 由于线上的应用都是服务化工程,远程调用时,必须具备压测流量的标记透传能力。\\t
  3. 线上的少部分应用,需要访问第三方服务,比如:物流、支付。这些应用需要改造为压测的流量直接访问mock服务器。\

全布式流量下发器设计与链路设计的能力

\\

我们选用gatling作为我们的流量下发器实现。

\\

\\

数据文件的内容

\\

每一种场景都有不同的数据文件,数据文件由场景相对应的多种url组合而成。比如:我们本次压测会压“无优惠的场景、秒杀场景、满减场景、拼团场景” 等等。无优惠的场景分为“店铺首页、商品详情页、加购物车页、下单页、支付页、支付成功页”等等。这个文件不涉及漏斗转化率。一般来说,一个数据文件很大(至少是G级别的)。所以我们的数据文件内容格式为:

\\

  • 所有的数据⽂文件\\t

    • 无优惠的场景数据文件\\t\t

      • 场景集合1\\t\t\t

        • 店铺首页URL\\t\t\t\t
        • 商品详情页URL\\t\t\t\t
        • 加购物车页URL\\t\t\t\t
        • 下单页URL\\t\t\t\t
        • 支付页URL\\t\t\t\t
        • 支付成功页URL\\t\t\t

        \\t\t\t

      • 场景集合2\\t\t\t
        • 店铺首页URL\\t\t\t\t
        • 商品详情页URL\\t\t\t\t
        • 加购物车页URL\\t\t\t\t
        • 下单页URL\\t\t\t\t
        • 支付页URL\\t\t\t\t
        • 支付成功页URL\\t\t\t

        \\t\t

      \\t\t

    • 秒杀场景数据文件\\t\t
    • 满减场景数据文件\\t\t
    • 拼团场景\\t

    \

流量下发脚本的内容

\\

流量下发脚本的核心是控制漏斗转化率:

\\

  1. 不同场景的流量配比。\\t
  2. 每个场景下面,url从上往下的漏斗转化率。\

gatling提供天然的转化率配置脚本,用起来非常方便。有兴趣的同学可以自行Google。

\\

水位检测系统的能力设计

\\

这个是一个很重要的模块,在项目启动之初,我们希望以实时计算的方式,一边采集各个应用系统的资源使用情况+接口耗时+业务正确率,一边向gatling发送流量干预信号,以做到自动保护系统的目的。由于时间关系,我们并未实现这一方案。取而代之的是人肉查看实时监控界面的方式,人为去干预gatling的流量下发情况。

\\

全链路路压测的实施

\\

如果实施过全链路压测的项目,大家都会有一个共同的感受:做基础的组件容易,让核心业务去完成相关的升级与验证工作很难。原因只有一个:需要用全链路压测的公司,业务规模都很大,涉及的团队会特别多。梳理理清楚庞大的业务,让所有的业务团队一起发力,本身就是一件很难的事情。

\\

我们把链路压测的实施分为以下几个阶段:

\\

  1. 基础中间件开发,各种框架升级开发,压测器研究与脚本开发。\\t
  2. 业务升级与线下验证(人工点击,数据落影子库)\\t
  3. 业务升级与线上验证(人工点击,数据落影子库)\\t
  4. 数据工厂数据准备。\\t
  5. 小流量下发验证(用gatling下发,数据落影子库)\\t
  6. 大流量量压测与系统扩容\

第2、3、5阶段,需要借助业务测试同学的力量;第4阶段,需要借助业务开发同学的力量;第6阶段,则需要借助业务团队+运维同学的力量。

\\

由于每个阶段人员都不太一样,所以需要每一个阶段都组织不同成员的虚 拟小组,借助各个团队的力量完成相应的工作。

\\

压测过程中的重要细节与把控

\\

流量爬升的规律

\\

正常来说,在大促之前做压测,目的一般是给扩容/优化做方向性的指导。

\\

假设我们双十一需要扩大20倍的容量以应对高峰,那我一定不会一开始 就拿20倍的流量去压我们的系统,因为这样做的话,所有的系统都会在一瞬间就挂掉,这样没有任何意义。我们的做法是,阶段性的爬坡打流量,然后把系统的能力一段一段提升上去。

\\

例如:

\\

  1. 第一天,我们会以日常流量的最高峰为起始流量,然后爬坡到一个流量高峰A,记为第一天的目标。在压测之前先做一次扩容。在压测中,碰到了某个瓶颈了,通过增加该系统的机器来提升能力。\\t
  2. 第二天,我们以A为起始流量,然后再次爬坡到B。同样压测前做扩容+压测中碰到瓶颈加机器。\\t
  3. 以此类推,一直到最终流量达到目标流量为止。\\t
  4. 每一天的压测,也需要以慢慢爬坡的方式提升流量。在爬坡的某个高度稳定5分钟,然后再次爬坡。稳定时间5分钟,爬坡时间30秒。\

\\

非核心链路进核心链路的问题

\\

发现并解决这个问题,本身就是压测的目的之一。

\\

正常来说,非核心链路,在大促来临时不会扩大多少容量。当压测的压力增大时,很容易通过系统报警查到。

\\

当发现这个问题的时候,一定要坚决要求业务方做系统改造,把非核心系 统的强依赖去掉。解耦的技术有很多,需要根据不同的业务规则来选择方案。比如:业务降级、通过中间件解耦、异步化等。

\\

上下游扩容/代码优化的选择

\\

一般来说,在压测的过程中,当碰到压测流量不能再升高的时候,会有很多原因,我们碰到的情况有以下几种:

\\

  1. 下游的某些服务化工程的能力达到瓶颈了,导致网关RT值升高,拖累整个集群的QPS上不去。\\t
  2. 网关应用自身的能力达到瓶颈。\\t
  3. 中间件/DB能力达到瓶颈。\\t
  4. job的能力达到瓶颈,导致数据处理不够及时。\\t
  5. 流量集中的页面,消耗了集群大量资源,如:店铺首页、商品详情页等。\

针对2、3、4这样的情况,我们的选择是毫不犹豫地加机器,代码优化的性价比较低。

\\

针对第1种情况,需要做一些分析,如果这样的能力是在系统设计者的预期之内的,可以选择加机器,如果完全超乎意料的,一定需要通过程序优化来提升能力,否则加了资源,可能还是瓶颈。

\\

针对第5种情况,一定要做的事情是静态化。因为这些流量集中页面,一般都是展示性质的。不管如何做应用内的优化,获得的能力提升远不如做静态化的收益大。

\\

未来展望

\\

全链路压测的方案有赞只是初试牛刀,我们已经看到了这个方案在提升+验证集群处理能力方面巨大的价值。当前,这个方案做得还较粗糙,存在一些问题:

\\

  1. 压测只能在夜间做。\\t
  2. 压测中需要有很多业务开发人员陪同。\\t
  3. 链路规划复杂度太高。\\t
  4. 压测控制台的稳定性还不够高。\\t
  5. 水位检测与流量干预是通过肉眼观察监控来实现。\

后续我们团队会继续投入大量精力去完善整个方案。希望可以将压测方案变成:

\\

  1. 线上测试链路的机器人,实时检测线上系统的正确性,同时没有脏数据干扰。\\t
  2. 测试同学手里的工具,做到流量压测常规化,开发同学不用陪同。\\t
  3. 压测可以在白天进行,晚上熬夜毕竟不利于健康。\\t
  4. 链路规划图形化,并与数据工厂结合,完成数据的准备工作。\\t
  5. 通过水位检测与流量干预来保护系统,让业务系统不会被压崩溃。\

作者介绍

\\

金瑞敏,有赞核心交易、java框架团队负责人。带领团队完成核心交易平台化体系建设,优化有赞服务化治理方案、环境隔离方案、全链路压测方案等等。长期从事分布式系统的建设与研究。

有赞11·11:全链路压测方案设计与实施详解相关推荐

  1. dubbo 服务压测_全链路压测资料汇总——业内大厂解决方案

    最近忙于公司的全链路压测平台调研和技术规划文档输出工作,参考了全网能搜到的业内大厂的全链路压测方案,这里做个汇总,以及将个人认为可以落地的方案做一个关键点整理. 技术链接 滴滴全链路压测解决之道 阿里 ...

  2. 微服务:全链路压测和容量规划

    什么是全链路压测? 基于实际的生产业务场景.系统环境,模拟海量的用户请求和数据对整个业务链进行压力测试,并持续调优的过程 主要特征: 真实流量 线上环境 实时监控和过载保护 全链路压测组成 单链路指一 ...

  3. 高德地图全链路压测平台TestPG的架构与实践

    高德地图:全链路压测平台TestPG的架构与实践 转自  https://www.sohu.com/a/341414025_692515 1. 导读 2019年以来,高德DAU一个亿进入常态,不断增长 ...

  4. 阿里10年分布式技术沉淀:阿里高可用体系核心缔造者、全链路压测创始人告诉你!...

    原文链接 7月27日,云栖社区.阿里中间件将举办首届阿里巴巴中间件技术峰会,揭秘阿里10年分布式技术干货.目前活动官网已上线:https://yq.aliyun.com/promotion/262,  ...

  5. 阿里10年分布式技术沉淀:阿里高可用体系核心缔造者、全链路压测创始人告诉你!

    原文链接 7月27日,云栖社区.阿里中间件将举办首届阿里巴巴中间件技术峰会,揭秘阿里10年分布式技术干货.目前活动官网已上线:https://yq.aliyun.com/promotion/262,  ...

  6. 中通全链路压测探索与实践

    01 背景 目前在中通性能测试主要分为线上和线下压测两种方案,在反复实践过程中我们渐渐发现这两种方案都有着各自不足之处,且为压测工作带来了很多不便.以下就线上和线下压测的不足分析,谈谈中通是如何一步步 ...

  7. 独家揭秘 | 阿里怎么做双11全链路压测?

    阿里妹导读:全链路压测是阿里的首创,我们将从工作内容.操作过程.运行总结等多个方向来介绍下阿里内部典型电商活动(如双11准备),以给大家展示一个完整的压测流程,帮助更多的企业和用户更好的完成性能测试. ...

  8. 【独家揭秘】阿里怎么做双11全链路压测?| CSDN 博文精选

    戳蓝字"CSDN云计算"关注我们哦! 作者 |  牛兔 转自 | CSDN企业博客 责编 | 阿秃 阿里妹导读:全链路压测是阿里的首创,我们将从工作内容.操作过程.运行总结等多个方 ...

  9. 全链路压测体系建设方案的思考与实践

    在阿里淘宝 双11 的过程中,长期以来都是在生产环节做全链路压测的,通过实践我们发现在生产环境中做压测,实际上会和一个 IT 组织的结构.成熟度.流程等紧密相关,所以我们把全链路压测从简单的制作范围内 ...

最新文章

  1. 利用牛顿法求平方根-Go语言实现
  2. 【Qt】QtCreator无法调试终端程序,启动报错SIGSTOP
  3. Windows Mobile使用Web Service上传和下载二进制数据流
  4. 奇异值分解和图像压缩
  5. 微擎小程序怎么配置服务器域名,随便撸源码源码微擎小程序通用配置图文教程,教会你怎么配置微擎小程序!...
  6. mybatis select语句会默认带排序吗_10月阿里最新38道Java面试题解析(MyBatis+消息队列+Redis)...
  7. unity3d android debug log,调试 – 如何在连接到设备时看到MonoDevelop Unity中的Debug.Log输出?...
  8. 热点和秒杀来临前要做的5件事
  9. 拓端tecdat|【视频】R语言中的隐马尔可夫HMM模型实例
  10. 【bzoj1022】[SHOI2008]小约翰的游戏John 博弈论
  11. 史上最全SQL基础知识总结(理论+举例)
  12. python字体描边_使用 python 将文泉驿字体导出为 fnt 格式的bitmap font
  13. 330425-01-00本特利内华达加速度计
  14. 我转行程序员的那一年(五)
  15. 千万别说你会Python!如果不知道这10个Python包!
  16. iOS迅雷V6.01更新,变化重大丨附下载地址
  17. VBR与CBR的区别是什么?
  18. Java Stream API概述
  19. 第三方登陆(一)微信登陆
  20. 魔兽怀旧玩家显示服务器名称插件,新手必看:非插件相关的魔兽怀旧服常用系统设置...

热门文章

  1. 跟你聊得这么投缘,你却说自己不是人?!
  2. 英伟达发布“空气CPU”,Arm架构专为AI而生,性能超x86十倍,与自家GPU更搭
  3. Nature盘点的这些代码,个个都改变了科学:Fortran、AlexNet还有arXiv等
  4. 「GNN,简直太烂了」,一位Reddit网友的深度分析火了
  5. 小冰完成数亿元Pre-A轮融资,投资方为北极光创投和网易,还宣布了和老东家微软的战略合作...
  6. 你们AI圈儿,已经引起了罗马教皇的警惕
  7. 程序员硬核劝告:现在还不是出门的时候
  8. 油管网红AI老师人设崩了:搞培训货不对板,谈退钱一律拉黑
  9. vue cli3.0 引入eslint 结合vscode使用
  10. 运行自己的shell脚本