作者|张天博(搏天)

出品|阿里巴巴新零售淘系技术部

导读:随着业务的不断发展, 整个淘系的服务端已经有数千个应用,在淘宝已经有非常大的应用数量和变更次数的基础上, 对流量回放也有更高的要求。那么在不断尝试流量的录制与回放的过程中,我们遇到了什么问题?那么在不断尝试的过程中,我们遇到了什么问题?我们由从中得到了什么启示?流量录制回放又能给我们带来多少收益?本文将一一介绍。

开源地址

提前放出开源地址,本开源项目是一款 基于 JVM-Sandbox 开发的一款 Java 流量录制、回放通用解决方案,下文将会详细介绍,长按识别下方二维码,关注“淘宝技术”官方公众号,并在对话框回复“git”即可获得下载链接、了解更多详情。

为什么需要流量回放

淘宝网陪伴我们剁了已经有 15 年的手,在经过这么久的演变后, 整个淘系的服务端已经成为了有数千个应用, 每年变更数万次的大航母, 我们在面对这个航母时, 需要既能全方位了解系统的全盘数据,又能从小处着眼,观察 细节的精细代码运行状况。

并且, 面对全国以至于全世界物联网网民时,我们的测试用例写的肯定会有疏漏和不足, 我们也希望能从线上获 取到更加有意义的用例。

同时,我们整个淘宝已经有非常大的应用数量和变更次数了, 我们对流量回放也有更高的要求。

于是,我们开始了我们的流量回放研发之路。

技术选型

技术上选型我们使用了 JVM-Sandbox (以下简称 sandbox ), 其主要的特性与我们想满足的需求都是比较贴切的。

淘系技术质量开源项目「JVM-SANDBOX」在《MTSC 2019年度开源项目奖 花落淘系技术质量团队》一文中有提及,如果要获取开源地址可关注“淘宝技术”官方公众号,并在对话框回复“测试”即可获得下载链接、了解更多详情。

第一个流量录制与回放

首先,我们要找到第一个可录制的流量, 我们曾经尝试过比较简单的实现方案, 比如直接录制入口请求的地点, 然后通过 JSON 化后打 LOG , 回流数据, 进行数据存储后, 以泛化调用的方式进行回放。 这样实现起来固然简单 并且快捷, 但是这样有一个致命的问题, 那么就是我们丢失了大量的 class 信息,  class 信息丢失对于比较重的参数、返回值执行是有相当大的风险的, 会导致无法无法反序列化, 导致回放失败, 也可能因为循环引用,需要进 行定点改造, 这样就非常麻烦了,做不到我们的 0 代码改造。

当我们意识到这个问题后,我们明确的分析了问题所在, 解决办法也比较明确了, 因为只有同样的 JVM 才会加载 出同样的 class 信息,所以我们必须要在同JVM对录制的参数、返回值进行 java 序列化/反序列化( hessian/kyro 等)进行录制, 在同机进行反序列化后进行同机回放, 保证原汁原味 的 class 信息, 不再会有无法反序列化的问题。

★ 录制部分

通过 sandbox aop 到中间件层的 invoke 方法, 获取参数和返回值, 以 hessian 序列化成二进制,并通过消息的方式 发送至服务端进行存储。

★ 回放部分

从存储的二进制的数据拉取到本机, 通过反序列化成为 JavaObject , 直接以本地代码 invoke 执行, 得到返回值后 进行对比,得到结果。

于是,我们第一个简单且稳定的录制回放就完成了,  review 一下:

可以看到,我们这个方法可以解决读接口的行为,无法满足写接口的行为, 写坏数据了就会引起故障, 我们如果想完整的进行录制回放,那么我们必须要解决这个写接口回放的问题。

写接口的录制和回放

我们究竟要怎么测写接口?如果是要完整落库后删除,那么可以通过回溯 binlog 等方式尝试做到,但是成本极高, 我们选择退而求其次的方式:在回放时,只要参数和类型一样, 就将真正的写行为直接 mock 掉。其具体做法就是:

在这里,我们将所有的 JVM 内请求进行了分类, 以URI作为区分类型标准, 以URI为准进行回放的 mock 行为准 则, 那么我们的整体架构有了一点点改变:

★ 录制部分

我们将所有的子链路都进行了录制, 每一个我们认定的子链路都以序列化的方式进行了存储,并且加入了 URI 和 index 来进行区分。

★ 回放部分

回放的时候, 每当回放流量执行代码中遇到我们的子链路代码时,都从数据中拉取相同 URI 的数据进行反序列 化, 当参数一致时, 直接以录制时的结果进行返回, 返回录制的那一个子链路的反序列化的 object 。

在这里可以看到,我们还有一个 script engine , 这里是插入了一个 groovy 代码执行器,主要是为了当我们遇到诸 如时间 、动态配置等类型的数据时,参数不一致,导致了我们子链路请求不一致, 无法正确的进行对比参数回放,所以通过一段 groovy 代码进行录制参数和执行参数修改, 将值赋值成为同样的结果后, 动态数值就会被固定 下来,可以被整成回放了。

至此,我们的写操作也完整的进行了录制和回放, 也保证了数据安全。

不过,我们可以看出,当我们将线上流量的录制量提高以后,我们出错后的排查成本非常高, 比如同样一个接口 的 1 万个 case 错 2000 个, 这里需要排查起来就太困难了,我们需要更加完备的测试方式进行区分和组合我们的 case 。

执行范围与测试范围分析

我们在制作录制回放的同时,我们也做了基于接口链路的执行路径录制,可以很明确的分辨出每一个请求的执行 代码路径(类似 Jacoco ,不过 Jacoco 是基于整体的, 基于接口/线程级需要自己修改 Jacoco , 也不是很复杂), 基于这个路径,我们做了以下的事情:

1. 进行了代码链路聚合,录制的 case 我们可以用执行路径的区别进行等价类划分,称为链路热度,同样的路 径,我们可以一目了然, 以同样的路径进行推荐就可以作为链路 case 推荐,大大减少重复的 case 。

2. 代码路径在回放的时候也进行链路追踪,执行追踪后可以得到路径的diff,也同样的能感知到修改的代码是 否对结果有影响,是否链路发生改变, 可以得出变更的范围。

总体效果及展望

目前我们在运行的流量录制回放应用在例如大型架构迁移应用上,基础能力的回归基本可以做到 0 成本, 可以稳定 的进行回放。

经过过去一年的建设, 如本文开头说的,我们开源了这整套体系,不过,我们并不会止步于此, 基于JVM-sandbox 和 repeater ,我们更多可以涉足的领域,例如:压测数据生成、故障模拟、混沌工程等应用场景, 我们将一直向前, 为整个行业带来丰富多彩的能力。

推荐阅读

历时1年,上百万行代码!首次揭秘手淘全链路性能优化(上)

阿里首次将用户手势数据用于电商场景!淘宝提出的算法DIPN秒杀传统模型

海量流量下,淘宝如何进行稳定的流量回放?相关推荐

  1. 弘辽科技:淘宝补单补多久流量提升?有什么方法?

    补单不是仅仅靠额运营就可以操作,想要安全更加有效,就需要运用到一些技巧和方法,同时搭配上一些好用的工具,就可以达到更好的效果,那么淘宝补单补多久流量提升? 淘宝补单补多久流量提升? 一般情况下,21天 ...

  2. 淘宝新店铺怎么提升流量?方法有哪些?

    现在淘宝开店的商家可以说是越来越多的哦,在这种情况下,要做好淘宝店铺并不容易哦,那么淘宝新店铺怎么提升流量?方法有哪些?下面的内容中为大家进行介绍,希望对大家有所帮助.   1. 首先,要给自己的淘宝 ...

  3. 弘辽科技:引爆店铺流量的淘宝关键词技巧

    原标题<弘辽科技:引爆店铺流量的淘宝关键词技巧> 现在顾客网购时,通常会搜索关键词来找到符合自己需求的商品,所以关键词是可以直接反映顾客购买意图的一个体现.因此,许多山上更加都会把关键词优 ...

  4. 淘宝新品店铺如何快速打造店铺自然搜索流量?淘宝自然搜索流量优化方法介绍

    在淘宝开了新的店铺,想要将店铺生存下去并不是一件简单的事情,因为如今在如此激烈的淘宝环境下,有很多的商家因为竞争压力都退出了淘宝商城.所以商家必须要懂得如何才能将新店运营好,下面就给大家带来一些相关的 ...

  5. 弘辽科技电商专题,淘宝老店新开获得流量的策略与方法

    原标题:<弘辽科技电商专题,淘宝老店新开获得流量的策略与方法> 由于很多原因,很多人开了淘宝店铺之后,就没有再去打理店铺,这就会导致淘宝店铺被释放.等到我们有时间了,想要重新开店的时候,却 ...

  6. 淘宝标签单法做好这6步,帮你快速上淘宝首页,提升宝贝流量

    我们淘宝店铺里的宝贝,都有自己的标签.这个标签就是顾客找到宝贝的入口,可以说标签是流量来源的核心.总之,宝贝标签打得好,流量自然不会差!那么我们如何给宝贝做好标签呢?答案就是"刷" ...

  7. 网站流量变现 , 淘宝/京东/拼多多精准商品推广赚钱....

    2019年响应式商品单页,淘宝/京东/拼多多/网页流量推广单页 网站流量变现 , 淘宝/京东/拼多多精准商品推广赚钱- 精彩教程,流量王"零投资网赚" 网站\公众号\自媒体有粉丝. ...

  8. 2018年淘宝新店开业怎么引流量

    转眼2018年已经到来,有人欢喜有人愁,双十一双十二有的人赚了人家几年辛劳都赚不回的钱,有的人店铺冷冷清清凄凄惨惨凄凄,对于新开的新店何去何从,下面我把我的经验分享给大家,希望能帮到大家 第一:持之以 ...

  9. 淘宝天猫运营,淘宝客推广,店铺流量提升

    一.什么是淘宝客 淘宝客是除了钻展直通车外的另一种付费推广方式,是成交计费的推广模式,可以给店铺带来实际销量. 二.推广模式 淘宝客的推广模式是站外推广.主要过程是从淘宝客推广专区获取商品代码,任何买 ...

最新文章

  1. 关于稳定性和故障的一点思考,每个互联网公司都吃过这个亏!
  2. 【v2.x OGE-example 第二章(第二节) 修改器的使用】
  3. python下载安装教程3.8.0-Python3.8.0
  4. 天天象棋 残局闯关 第10关
  5. ubuntu16.04安装opencv3.4
  6. jquery validate表单验证插件
  7. 2018-07-10 为Chrome和火狐浏览器编写扩展
  8. Flask学习记录之Flask-SQLAlchemy
  9. 怎么卸载apowerrec_如何删除windows10自带应用
  10. android ui stencil kit 下载,实用的iOS6/iPhone5 GUI/iPad PSD以及其它版本素材
  11. 「镁客早报」蓝色起源完成无人火箭试飞;知名对冲基金做空高通...
  12. Struts2中带参数的结果集
  13. 802.11bgn信道划分及WirelessMon规划频段
  14. 『运维自媒体联盟』限时特供学习资源大礼包
  15. 符合W3C的网站的开发模型和必要性的探讨(一)
  16. Centos7磁盘阵列部署与修复
  17. Python实现支持向量机(基于双月数据集)
  18. 【1月英语—罗塞塔之爱】
  19. 设定是否使用IOB中的寄存器
  20. android camera 工作原理,Android Camera原理之openCamera模块(一)

热门文章

  1. 一个例子让你明白什么是CART回归树
  2. 不太常用,但万一用到一定要会的vue打印功能
  3. kkj twj hwj详解
  4. 闲鱼卖盗版课被告赔偿50万
  5. 微信小程序禁用页面下拉,且局部上下滚动不卡顿
  6. Excel如何批量选中全部图片?
  7. html5实现第三方支付,js实现弹窗功能(以支付方式为例)
  8. visio中圆柱体的画法
  9. python 操作 mongodb 的一系列方法封装大家拿去用很好用
  10. Python值传递还是引用传递