JVM-SANDBOX:从阿里精准测试走出的开源贡献奖

简介: 稳定性是历年双11的技术质量保障核心。从 2016 年开始淘宝技术质量部潜心修行,创新地研发了一套实时无侵入的字节码增强框架,于是「JVM-SANDBOX」诞生了,并且顺手在 MTSC 大会上拿了开源贡献奖,今天,我们来瞅瞅这个拿奖的项目。

1


阿里妹导读:稳定性是历年双11的技术质量保障核心。从 2016 年开始淘宝技术质量部潜心修行,创新地研发了一套实时无侵入的字节码增强框架,于是「JVM-SANDBOX」诞生了,并且顺手在 MTSC 大会上拿了开源贡献奖,今天,我们来瞅瞅这个拿奖的项目。

在近日举行的中国移动互联网测试开发大会(简称MTSC大会),来自淘系技术质量开源项目「JVM-SANDBOX」以及淘系同学参与维护的「 ATX」 包揽了 MTSC 2019 年度开源贡献奖,表彰过去一年在测试领域开源项目中的突出贡献。其中,「JVM-SANDBOX」致力于为服务端稳定性领域提供实时无侵入的字节码增强框架。

一、JVM-Sandbox的诞生

功能回归、业务/系统监控、问题排查定位、强弱依赖、故障演练等是阿里 10 年双十一沉淀积累下来的稳定性专项,也是历年双十一质量保障的核心要素。要有效、轻量级地实现这些稳定性专项,都会触及到一块底层技术—— java 字节码增强。如果每个专项都能自己实现一套字节码增强逻辑,实现的门槛高、投入和维护成本高,且不同专项间相互影响造成不可预知的风险。如何屏蔽字节码增强技术的高门槛,降低成本,同时又能支持上层多个专项功能的快速实现和动态管理,成为淘宝技术质量部的目标。从 2016 年开始我们潜心修行,创新地研发了一套实时无侵入的字节码增强框架,于是 「JVM-SANDBOX」 诞生了。

对上面提到的专项进行抽象分析:

  • 故障演练:在运行前,抛出异常或增加运行时间,即:干预方法的执行顺序和改变返回值;
  • 强弱依赖梳理:系统运行时,实时记录系统的对外调用情况,即:感知方法的入参和返回值;
  • 录制回放:运行时,记录方法的入参和返回值,回放时,不真实对外调用,而是直接返回录制时的返回值。即:感知方法入参和返回值,干预方法执行顺序,改变返回值;
  • 精准回归:获取每个请求的行调用链路,根据行调用链路进行场景去重,根据代码改动的情况和行调用链路确定需要回归范围,即:运行时行链路感知。

不难发现,要解决这些问题本质就是如何完成 java 方法的环绕管控和运行时行链路的获取,即 AOP 框架的解决方案。目前常用 AOP 框架的解决方案有两种:proxy 和埋点。proxy 的优点在于已实现了统一的 API,减少了重复投入,但是不能实时生效,需要系统编译重启。埋点的优点在于动态生效灵活度高,但是没有统一 API。

要快速解决上边的三个问题,我们需要的 AOP 解决方案必须具备两个特性:

  • 动态可插拔,即实现埋点方式的统一的 API;
  • 无侵入性,即解决 JVM 类隔离的问题。

基于以上需求,我们研发了 JVM-Sandbox。

二、实现方式

JVM-Sandbox 由纯 Java 编码完成,基于 JVMTI 技术规范,为观察和改变代码运行结果提供了即插即用模块接口的容器,提供两个核心功能:实时无侵入 AOP 框架和动态可插拔的模块管理容器。

2.1 JVM-Sandbox的核心功能

  • 使用埋点技术提供统一的 API,来实现无需重启的 AOP 解决方案;
  • 使用容器完成 JVM 类隔离,来解决侵入性问题;
  • 提供容器管理机制,来完成各种容器的管理。

2.2 JVM—Sandbox的核心事件模型

BEFORE、RETURN 和 THROWS 三个环节事件的正常流转和干预流转。

3

2.3 整体架构

4

沙箱一共由三大核心功能组件构成

  1. 代码编织组件:负责完成预设代码的重写和生效;
  2. 事件处理分发组件:负责完成事件的分发和方法流控控制的执行;
  3. 模块管理组件:负责控制和管理沙箱的各个模块。

沙箱的底层提供了一个 HTTP-SERVER(Jetty),通过 HTTP 协议完成 sandbox.sh和沙箱的控制交互,同时也给各个模块提供了基于 HttpServlet 和 WebSocket 规范的 API,各模块可以复用沙箱完成各自模块的控制与交互。

三、业务的实践效果

3.1、线上故障演练

17年故障演练平台在 JVM-Sandbox 基础上仅耗时1周即完成故障注入部分的系统重构。重构后的系统在挂载效率和挂载成功率方面有了明显的提升,极大地缩短故障演练的时间,演练效率提升了数十倍。基于 JVM-Sandbox 改造后的故障演练平台,通用性强,所有基于 JVM 启动的系统均支持,极大地拓展了故障演练的范围,故障演练已达到集团级部署。

与16年故障演练数据对比,17年的故障演练平台,覆盖 BU 提升了1.6倍,覆盖应用提升了5倍,覆盖场景提升了37倍。18年故障演练平台覆盖了阿里集团,并演化为现在的攻防演练。

3.2、依赖检测

17年强弱依赖自动化检测平台诞生。它提供了依赖检测、强弱分析、依赖扫描、故障注入等多种能力,底层能力基于 JVM-Sandbox 在1周内完成功能开发。利用其模块容器的特性,将前人开发的模块与新增模块一起挂载共同工作,完成平台功能。

强弱依赖梳理方面,承载了淘宝的系统强弱依赖梳理工作,260+个应用一键接入系统,并实现了0人工成本的自动化、智能化梳理。18年与 Mock 回放相结合,实现写接口依赖自动检测功能,目前正在不断完善。

3.3、服务端录制隔离回放机制

在 JVM-Sandbox 基础上开发了一个 SS 模块,相当于一个录音机+回放机, 在调用中间件的时候, 顺序录制下了我们的中间件请求,并且存储这份‘磁带’到服务器上。当我们需要隔离回放的时候, 将这份‘磁带’找到, 并且在需要的时候直接从‘磁带’读取, 并不需要真实地请求我们的中间件, 这样就保证了我们的读、写接口也能做到可重复使用,从而实现服务端的隔离回放。线上录制隔离回放不仅极大地缩短业务回归的耗时,把业务测试同学从繁琐的数据准备和接口自动化脚本的编写过程中解放出来,而且极大地拓展了覆盖范围,使回归的范围更贴近用户,且场景更丰富。

3.4、精准回归

服务端录制隔离回放机制诞生之后,虽然有效地提升了覆盖范围,降低了自动化脚本的人工投入,但是也带来了新的问题。线上录制的场景是海量的,单个系统都可以达到万级、十万级甚至百万级别的录制,这些录制的场景中,存在大量的重复场景,如何识别重复场景,实现有效、精准的回放,成为新的待解决问题。在 JVM-Sandbox的基础上,利用 LineEvnet 实现了行链路识别和标记,有效地提升了回放的精准度和效率。

四、开源社区

目前基于 JVM-Sandbox,上层有阿里两个开源的模块:chaosblade——故障演练,Repeater——录制回放,后续还会逐步开源其他模块功能,社区目前已经有900+的人群参与讨论共建,累计获得2000+的star支持,JVM-Sandbox的社区建设也期待您的加入。

五、结束语

我们的每一步都是为测试领域的标准化建设做努力,希望更多对测试技术发展感兴趣的小伙伴可以加入社区,一起为测试领域的发展做贡献。

如果您有兴趣加入淘系技术质量团队,和我们一起投入到测试领域发展建设中,欢迎投递简历至 taobaoqa2019@list.alibaba-inc.com。

彩蛋时间:

工程师的世界,不止代码,还应有对未来的洞察与从容。阿里首部技术经验精选集:《不止代码》,可免费下载阅读。阿里多位P9、P10技术大牛现身说法,用十多年阅历和经验,陪你“打怪升级”。点击下方阅读原文,立刻下载!

原文发布时间为: 2019-07-5
本文作者: 何霜霜(谢萱)
本文来自云栖社区合作伙伴“ 阿里技术”,了解相关信息可以关注“ 阿里技术”。

相关文章
|
2月前
|
存储 前端开发 架构师
阿里资深架构师带你深入浅出JVM!
JVM = 类加载器(classloader) + 执行引擎(execution engine) + 运行时数据区域(runtime data area)
40 1
|
3月前
|
算法 Java
太狠了!阿里技术专家撰写的电子版JVM&G1 GC实战,颠覆了传统认知
JVM是Java语言可以跨平台、保持高发展的根本,没有了 JVM, Java语言将失去运行环境。针对 Java 程序的性能优化一定不可能避免针对JVM 的调优,随着 JVM 的不断发展,我们的应对措施也在不断地跟随、变化,内存的使用逐渐变得越来越复杂。所有高级语言都需要垃圾回收机制的保护,所以 GC 就是这么重要。
|
4月前
|
运维 算法 安全
阿里P8写出的《深入理解Java虚拟机3》轻松学会JVM底层
Java是目前用户最多、使用范围最广的软件开发技术,Java的技术体系主要由支撑Java程序运行的虚拟机、提供各开发领域接口支持的Java类库、Java编程语言及许许多多的第三E方Java框架(如Spring、 MyBatis等) 构成。在国内,有关Java类库API、Java语言语法及第三方框架的技术资料和书籍非常丰富,相比而言,有关Java虚拟机的资料却显得异常贫乏。
|
4月前
|
网络协议 Java 关系型数据库
年薪50W阿里P7架构师必备知识:并发+JVM+多线程+Netty+MySQL
线程基础、线程之间的共享和协作一 线程基础、线程之间的共享和协作二 线程的并发工具类 线程的并发工具类、原子操作CAS 显式锁和AQS一 显式锁和AQS二 并发容器一 并发容器二 并发容器三、线程池一 线程池二、并发安全一
|
8月前
|
存储 监控 算法
阿里面试官,别挂电话,jvm性能调优,我还能说上半小时
性能调优:性能调优包含多个层次,比如:架构调优、代码调优、JVM调优、数据库调优、操作系统调优等。架构调优和代码调优是JVM调优的基础,其中架构调优是对系统影响最大的。性能调优基本上按照以下步骤进行:明确优化目标、发现性能瓶颈、性能调优、通过监控及数据统计工具获得数据、确认是否达到目标。
70 0
|
4月前
|
Arthas 架构师 Java
阿里P9级架构师马士兵花四小时让你搞懂JVM底层原理(附JVMpdf)
JVM面试难题 当面试官向你提问JVM的实战问题时,你是否感觉到无所适从? 想解决生产环境中的GC问题,你是否感觉到狗咬刺猬,无处下嘴? 面对JVM的海量参数,你是否感觉到迷茫无助? 看过很多的JVM文章,但当遇到了生产环境中真实问题的时候,你是否依然不知道如何进行分析排查?
|
4月前
|
Java 编译器 开发者
旁边的同事突然晋升阿里P7,只因偷偷学习了这份JVM笔记?
大家都是有经验的Java开发人员,想想为何要学习JVM? [面试?调优?装逼? ] 不管出于何种原因,总之你得先学好。那怎么学好呢?
|
4月前
|
架构师 Java 测试技术
阿里架构师的床头文案:深入理解Java虚拟机的权威指南PDF
Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。
|
4月前
|
存储 架构师 算法
收下我的膝盖!阿里架构师编写的668页Java虚拟机笔记真强
从Java诞生至今已有二十余年,基于虚拟机的技术屏蔽了底层环境的差异,一次编译,随处运行的思想促进了整个IT上层技术应用产生了翻天覆地的变化。Java作为服务端应用语言的首选,确实大大降低了学习和应用的门槛。
|
5月前
|
算法 架构师 Java
阿里P8架构师爆肝分享内部开源的JVM垃圾回收PDF文档,共23.3W字
说在前面 本文讲解的内容是关于垃圾回收(Garbage Collection,GC)的文档 ,为什么要写关于垃圾回收的文档呢? 首先,垃圾回收对应用影响很大,主要表现在应用停顿时间、吞吐量、资源使用等方面,开发者选择一种语言时考虑的一个重要因素就是该语言是否支持垃圾回收以及支持哪些垃圾回收实现(要综合考虑开发难度、效率和运行效率)。 其次,Hotspot是最流行的Java虚拟机(Java Virtual Machine,JVM。 本文使用JVM指代Hotspot虚拟机),垃圾回收是Java虚拟机最重要的组成部分,也是最复杂的部分之一。以JDK 8为例,共计支持5种垃圾回收实现,提供了超过
49 0