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

阿里妹导读:稳定性是历年双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 三个环节事件的正常流转和干预流转。

2.3 整体架构

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

  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。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518496.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EMR Spark Runtime Filter性能优化

背景 Join是一个非常耗费资源耗费时间的操作,特别是数据量很大的情况下。一般流程上会涉及底层表的扫描/shuffle/Join等过程, 如果我们能够尽可能的在靠近源头上减少参与计算的数据,一方面可以提高查询性能,另一方面也可以减少资源的消耗(网…

集齐最后一块拼图,全栈Serverless时代正式开启

近日腾讯云正式发布国内首个Serverless数据库新品——PostgreSQL for Serverless。相比普通云上数据库,该数据库能够最快1秒完成部署,成本降低70%。这款新型数据库将为数百万开发者带来更灵活的业务开发模式、更快捷的上云体验,以及更大空间的…

Java-所有类型的Class对象

public class Test04 {public static void main(String[] args) {Class c1 Object.class; // 类Class c2 Comparable.class; // 接口Class c3 String[].class; // 一位数组Class c4 int[][].class; // 二维数组Class c5 Override.class; // 注解Class c6 ElementType.cla…

分布式服务架构下的混沌工程实践

本文来自阿里巴巴高可用架构团队高级开发工程师肖长军(花名穹谷)在 GIAC(全球互联网架构大会)上的分享,包含三部分内容:(阿里巴巴中间件公众号对话框发送“混沌工程”,获取分享PPT&a…

Java-类加载内存分析

没有听懂 public class Test05 {public static void main(String[] args) {A a new A();System.out.println(A.m);/*1. 加载到内存&#xff0c;会产生一个类对应Class对象2. 链接&#xff0c; 链接结束后 m 03. 初始化<clinit>(){System.out.println("A类静态代码…

小谈CDN回源函数计算的应用场景

CDN团队联合函数计算团队近期推出了一个全新功能&#xff0c;即通过CDN把回源流量指向函数计算进行处理&#xff0c;该功能旨在帮助CDN用户能通过函数计算快速处理和便捷处理回源数据为目的&#xff0c;用户仅仅需要在CDN回源地址填写函数计算的自定义域名即可把请求转发到函数…

只需12 个步骤,就能在AWS中创建自定义VPC,用过都惊了!

作者| Kunal Yadav译者 | 天道酬勤 责编| 徐威龙封图| CSDN下载于视觉中国在本文中&#xff0c;作者将创建一个具有公共子网和私有子网的自定义VPC。每个子网中都有一个EC2实例&#xff08;已安装WordPress&#xff09;。亚马逊VPC图标公共子网中的实例可以通过互联网访问&…

阿里前端委员会主席圆心:未来前端的机会在哪里?

阿里妹导读&#xff1a;在近期举办的行业大会上&#xff0c;阿里前端技术委员会主席&#xff0c;淘系技术部资深总监圆心发表了《前端路上的思考》的演讲&#xff0c;分别从前端的发展历程、今天的机会、如何引领新技术、前端价值这四个方面进行深入探讨。流年笑掷&#xff0c;…

Java-分析类初始化

public class Test06 {static {System.out.println("Main类被加载");}public static void main(String[] args) throws ClassNotFoundException {// 1. 主动引用 // Son son new Son();/* 结果Main类被加载父类被加载子类被加载*/// 反射也会产生主动引用 //…

安卓应用开发顶级框架大盘点,总有一款适合你

作者 | Slava Vaniukov译者 | 苏本如&#xff0c;责编 | 夕颜封图 | CSDN下载自视觉中国出品 | CSDN&#xff08;ID:CSDNnews&#xff09;随着软件开发向移动应用的转变&#xff0c;越来越多的企业意识到&#xff0c;移动应用程序对于企业和客户之间建立牢固的联系至关重要。这…

蚂蚁金服王旭:开源的意义是把社区往前推进一步

互联网技术发展速度之快是所有从业者甚至非从业者都能感受到的。尤记得在世纪之交时&#xff0c;那时候互联网刚刚在中国开始向民用普及&#xff0c;不说支撑大规模的网站访问量的相关技术&#xff0c;就连 Linux、负载均衡甚至都没有被普遍使用。而在二十年之后&#xff0c;云…

Java-类加载器-类运行时结构-。。。。

https://www.bilibili.com/video/BV1p4411P7V3?p16 获取注解信息 https://www.bilibili.com/video/BV1p4411P7V3?p11 https://www.bilibili.com/video/BV1p4411P7V3?p12 https://www.bilibili.com/video/BV1p4411P7V3?p13 https://www.bilibili.com/video/BV1p4411P7V3?p1…

腾讯云成立星星海实验室,聚焦云原生服务器硬件研发

近日腾讯云宣布成立“星星海实验室”&#xff0c;这是腾讯历史上首个硬件工程实验室&#xff0c;也是腾讯云面向产业互联网加速技术自研的重要战略。 星星海取名自青海省果洛藏族自治州玛多星星海&#xff0c;以水为名&#xff0c;寓意灵动与智慧。据了解&#xff0c;星星海实…

【从入门到放弃-Java】并发编程-NIO-Channel

前言 上篇[【从入门到放弃-Java】并发编程-NIO使用]()简单介绍了nio的基础使用&#xff0c;本篇将深入源码分析nio中channel的实现。 简介 channel即通道&#xff0c;可以用来读、写数据&#xff0c;它是全双工的可以同时用来读写操作。这也是它与stream流的最大区别。 cha…

【IPF2020】浪潮集团执行总裁、首席科学家王恩东:智慧计算、源动新基建

CSDN记者于前方报道 众所周知计算力就是生产力&#xff0c;智慧计算改造升级了生产力三要素并最终驱动了人类社会的转型升级。具体来说&#xff0c;智慧计算将劳动者由人变成了人与人工智能的结合体&#xff0c;以此可以顺利实现指数级增长&#xff0c;将数据变成一种创新生产…

使用Spark Streaming SQL基于时间窗口进行数据统计

1.背景介绍 流式计算一个很常见的场景是基于事件时间进行处理&#xff0c;常用于检测、监控、根据时间进行统计等系统中。比如埋点日志中每条日志记录了埋点处操作的时间&#xff0c;或者业务系统中记录了用户操作时间&#xff0c;用于统计各种操作处理的频率等&#xff0c;或…

html-网页基本标签

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>基本标签学习</title> </head> <body><!-- 标题标签 --> <h1>一级标签</h1> <h2>二级标签</h2> <…

阿里AI再出神器,“你是什么垃圾”一拍便知

“干垃圾&#xff0c;还是湿垃圾&#xff1f;你是什么垃圾&#xff1f;” 相信魔都的小伙伴已经要被垃圾分类逼疯了&#xff0c;还要面临垃圾桶前&#xff0c;志愿者们的灵魂一问&#xff1a;“你是什么垃圾&#xff1f;” 更糟糕的是&#xff0c;垃圾分类&#xff0c;还要“…

【IPF2020】浪潮集团高级副总裁彭震:智算中心 筑基智慧世界

【快讯】浪潮关注智算中心&#xff0c;据浪潮集团高级副总裁彭震来看主要归结为几个主要问题&#xff0c;分别是算力、数据以及互联。此外针对智算中心的分析往往不仅仅是一个中心的单一要素&#xff0c;更多是很多中心之间彼此互联的关系&#xff0c;如何解决多元融合的问题才…

html-图像标签

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>图像标签学习</title> </head> <body> <!-- img学习 src: 图片地址 必填相对地址&#xff08;推荐&#xff09; &#xff0c; …