淘宝测试环境治理实践

11ad33dcbe28ef902df10ea1d28831d5.gif

去年之前,阿里巴巴的淘天集团测试环境是以领域方式运作:不局限测试环境治理本身,从测试模式方法论及用好测试环境思路引领集团测试环境治理。领域运作最难的是“统一思想”。业务进一步细分调整后,测试环境治理策略理应由业务方自行决策,领域尽可能多的提供更好用的工具产品供业务方使用。

测试环境产品得很稳定,让用户相信环境是可靠的,其次环境部署需要高效,二者缺一不可。下面从这两个方面做一下阐述。

f2c643a076cabb9373dbbd648648beca.png

测试环境可靠性

c8b10d7e5c2f2a76743f35f1b123f6d6.png

图1:测试环境使用示意图

从图1可以看出,可靠性主要有两个:

  • 路由隔离:需要精确。项目间调用乱窜,不仅会相互影响,还测非所测。

  • Stable环境:作为基座环境必须稳定。不稳定就会影响所有依赖的项目。

  路由隔离

通用的隔离逻辑:从项目环境发起的流量,下游默认调用项目环境,如果没有,就调用Stable环境兜底。这看似很简单,只要使用过都能理解,但要所有人都能理解(统一思想)又挺难。团队新人入职,都需要深入学习一遍。

因此环境组在上述通用逻辑基础上,做了账号与环境绑定的路由隔离产品:只要用户绑定了账号和环境的关系,这个账号所有到这个应用的请求,一定会走到绑定的环境上,而不用了解环境相关的任何业务逻辑。

dbb9c9a1e1e9c4142a03f71d68465d94.png

图2:路由隔离系统实现流程图

路由准确性高要求不言而喻,所以最近一年发了120+迭代来提升路由系统稳定性,稳定性有了质的飞跃。总结如下:

  • 重构字节码增强。

  • 升级插件安装:守护进程和路由插件分离。

  • 改进自建转发路由方案。

路由稳定性提升还在持续,长尾问题如流量账号解析等还需进一步挖掘治理。

  环境监控

Stable环境作为基座环境必须稳定,因此需要对Stable环境进行监控。Stable环境流量小,时有时无,和线上大流量不同,不可以通过流量下跌来判断稳定性。倘若借用线上思路,自动打大流量检测,投入产出比不高。环境组也尝试过,核心链路可行,但不具备通用性。经过这几年的实践,还是以业务视角的监控指标有用、可靠、维护成本低。

  • 检测进程、HSF接口心跳、磁盘空间

  • 接口(http(s)/HSF)自动化巡检并断言

监控只是提前发现问题,最终还是需要解决问题,所以发现问题后,系统先进行自愈(不限于重启、磁盘清理等),后故障仍然不能消除的,报警通知责任人,走GOC的风险预警及故障处理流程。

监控系统还需要考虑低成本的维护,在用户不介入的前提下就有较高的监控水平。环境系统自动同步Stable环境的变化,在无人介入情况下,通过fuzz方式随机出接口测试用例并发起接口调用巡检。针对不同的环境类型,分层处理,如:fuzz的测试用例是随机的,可以运用在线下Stable环境,而预发DB与线上共用,不能使用fuzz从而污染线上环境。同理,磁盘自动清理也只使用在线下。

环境的稳定,不仅仅在于服务的稳定,动态配置的一致性也至关重要。用户共用一套动态配置成本最低,而为了自己验证需要,可随意变更配置,以至于对其他用户产生影响也不自知。其他用户每次验证时不会也不可能做到check每个配置,就会出现“测非所测”情况。用户做不到的,由监控系统来兜底。

69656714dc896b8ab1d2e580a25d7d9e.png

图3:环境监控系统流程示意图

环境监控的业务监控逻辑也可以运用在线上环境,对线上环境监控是一个有力的补充。

  可观测

环境报警后的问题排查就依赖可观测产品来快速排查与定位,好的可观测产品一定具备以下特点:

  • 链路精确,不能有节点丢失

  • 通过账号、商品、订单等业务信息能轻松获得对应的traceId(链路id,链路唯一标识)

  • 沉淀参数数据,覆盖通用中间件协议与子调用

  • 节点调用的路由正确性判断并有具体的分析

  • 单节点应用可以查看包含trace的日志集合

  • 其他特点

    • 访问过的trace自动保存,任何时候都可以访问到

    • 请求需要秒级展示

    • 安全性:有数据脱敏能力。

在实际实施过程中,具有业务定制的技术栈如:function函数服务等都需要关联系统对接,“逢山开路、遇水搭桥”。这也是环境治理最需要坚持的事情。

启动加速

环境可靠是基石,基石稳定后追求的自然是高效部署;一个应用构建与部署时长超过10分钟,感受不强烈,但是放到淘天集团的体量对效率的影响就非常巨大。以我自己应用为例,全量部署一次在12分钟左右,一个feature开发完后的第一次部署,因为心理有预期,能接受这个时长,大不了喝杯coffee;但是改bug的时候,改了一行验证也是需要12分钟,这就很难接受了。一天通常得部署5~6次,但也喝不了那么多coffee;所以,高效部署不仅仅是高效这点收益,同时是程序员的幸福感提升。

“高效部署”这个命题,前人前赴后继做了很多的工作。去年我们环境组与阿里云jvm团队合作也在cds技术上做了研究与尝试。环境系统会自动将分支没有修改到的代码缓存起来,无需重新进行类加载,从而提升部署效率,单次部署时长缩短30s。有一定的效果,但和总量10分钟相比又显的是“萤火之光”。要想达到秒级效果,还是得死磕热部署。

c897dea15d22389da5d9b55731f335b9.png

图4:热部署与部署流水线结合

代码差异检测这一点,就很难做到100%,在当下基于dcevm技术、爱橙科技的fastboot技术基础上,再新增插件能力来解决。目前的思路是通过分层的方式:

  1. 只修改方法体的代码,直接redefine,秒级生效

  2. 文件的增删,bean与中间件等变更借助于dcevm与fastboot技术,做到秒级生效

  3. 对于确实无法做到的热部署的,与现有的部署方式保持不变,走全量部署。

自从尝试了一下启动加速的秒级效果,有那种“天突然亮了”的感觉。启动加速还在继续丰富插件来支持更多的场景,降低第三种部署方式的次数。

测试数据

测试环境高效稳定,其实还不能做到高效的验证,因为测试数据也是验证过程中的关键一环。核心团队质量TL明确和我说:“如果能解决好测试数据构造的问题,至少我们的效率可以再提升30%”。可见测试数据的重要性。为此进行了相关调研,结论如下:

1. 跨部门的数据构造依旧很难

2. 自己域内容易解决,但解决方案对外部门通用性不够。

3. 链路级别的数据构造基本上需要再新起应用来包一层服务来提供,成本高。

为此,环境组孵化了配置化数据构造的系统,具体的逻辑如下:

b10f57a211367bb2ca4b6f35a7a44c10.png

图5:配置化数据构造示意图

配置化数据构造,提供数据构造的两大基础能力:界面化通过接口完成数据配置单配置和用户利用基础节点编码框架生成配置单。用户可以通过Api界面化的面包版实时构造数据,也可以通过有保鲜能力的数据池直接领用想要的数据。

数据构造最核心的是原子数据的供给。供给原子数据丰富度以及更新效率直接影响上层用户的使用,这块是任何业务都需要优先保障的事项。

fd0cfb595f2ab3d6373008974095777e.png

可测性

测试环境与测试数据是研发效能问题的基座。依然存在上层可测性问题带来低效点。当然可测性问题不是某个环境特有的,只是部分环境如:线下环境可以暴力的去解决,譬如:直接update DB、clean cache、modify Date等快速支持让线下环境的可测性不是那么突出。在预发环境或者SPE环境下,因为DB和线上共用,使得很多解决可测性的策略都需要考虑不能产生故障这条铁律!下面以时间穿越案例做一下阐述。

  时间穿越

先抛一个问题:需要做一个活动,在3天后的00:00点发一批消费券。系统代码无需改动,只需要业务同学后台进行复杂的配置即可。那将如何测试?

  • 肯定不能等到3天后才来验证,这样来不及测试。

  • 如果配置两套活动,一套用来验证;另外一套设置3天后生效。

    • 如何保证这两套活动除了时间不一样,其他都一致,这也是需要验证的

    • 如果第一套用完还没有验证完成,需要再配置一套,又需要业务同学支持,业务同学本身是用户,有自己的本职工作,本不应参与过多的技术验证。

从上述分析,问题转化为:业务同学作为用户只想有且只配置一次消费券,技术同学需要保证业务同学配置的这次消费券是正确的,能正常的发送到C端消费者手上。这就需要时间穿越。

很显然想到的方法,就是修改机器时间,这样带来两个问题:

  • 修改机器时间影响有所用户,就必须要独占机器,其他验证不能共用。

  • 需要重启应用,环境准备时间长,用户不能接受

因此,好的时间穿越产品就至少要必须具备以下3点:

  • 只针对有需要穿越的用户生效,其他用户不受影响。

  • 环境准备时间要短。

  • 是否穿越成功生效排查方便,这点又和上述的可观测系统对应上。

环境组根据用户id,对System.currentTimeMillis做字节码增强,进行时间穿越,无需重启机器,环境准备时间<10分钟。

60822e79ea9712463405670682c9a8ff.png

图6:时间穿越流程示意图

目前时间穿越产品已经支持多次大促预演,时间穿越是可测性的一个缩影,随着对研发效能的深入,相信会有更多可测性问题等着我们去解决,研发效能也将会逐步提升。

17b9fa40c30ce798d5976f5624b328d1.png

结语

目前的测试环境实践部分方案是基于当前的现状做了局部最优的选择,并非终态方案。有些在已有的基础上做的升级,有些依赖于架构治理的妥协选择:

  • Stable环境稳定可靠最核心方案应该是运维等级等同于线上,如与线上一同发布、机器规格、部署策略、操作管控等。这方面能力淘天集团前几年已经完成相关的升级。

  • 可观测系统对长尾技术栈需要按部就班的接入,如果所有架构统一,也就无需多余的投入。

  • 动态配置产品在分支隔离和使用规范上做到极致,其实也无需配置巡检。

  • 如果大促活动系统可以做到业务配置活动“所配即所得”,也无需独立的时间穿越产品。

在此希望各位同仁在做任何系统的时候,在考虑“功能又不是不能用”的同时,多思考一下系统的可测性和规范统一性。

5972eb000179901a62c7adc22a91d898.png

团队介绍

我们是淘天集团-技术架构&后端研发团队,一支专注于研发基础设施和技术体系建设的团队,依托大淘宝现有的架构,致力于研发所需的运行时、工具、平台、流程等,确保研发效率的高效;不断探索和应用新技术、新方法,缩短交付周期、提高交付质量、降低交付成本,建立业界领先的技术架构和研发体系。我们不断通过技术创新和突破,使得淘天业务技术能快速响应市场变化和客户需求,提升公司的市场竞争力。

¤ 拓展阅读 ¤

3DXR技术 | 终端技术 | 音视频技术

服务端技术 | 技术质量 | 数据算法

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

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

相关文章

【MetaGPT系列】【MetaGPT完全实践宝典——多智能体实践】

目录 前言一、智能体1-1、Agent概述1-2、Agent与ChatGPT的区别 二、多智能体框架MetaGPT2-1、安装&配置2-2、使用已有的Agent&#xff08;ProductManager&#xff09;2-3、多智能体系统介绍2-4、多智能体案例分析2-4-1、构建智能体团队2-4-2、动作/行为 定义2-4-3、角色/智…

若能重回白宫,特朗普称将把比特币列为美国战略储备资产!

KlipC报道&#xff1a;当地时间7月29日&#xff0c;美国前总统特朗普参加比特币2024大会&#xff0c;并在会上宣布称&#xff0c;如果重返白宫&#xff0c;他将把比特币列为美国战略储备资产。讲话期间&#xff0c;比特币价格一度上涨到6.9万美元大关。 特朗普表示&#xff1a…

Photos框架 - 自定义媒体选择器(UI预览)

引言 在前面的博客中我们已经介绍了使用媒体资源数据的获取&#xff0c;以及自定义的媒体资源选择列表页。在一个功能完整的媒体选择器中&#xff0c;预览自然是必不可少的&#xff0c;本篇博客我们就来实现一个资源的预览功能&#xff0c;并且实现列表和预览的数据联动效果。…

前端基于 axios 实现批量任务调度管理器 demo

一、背景介绍 这是一个基于 axios 实现的批量任务调度管理器的 demo。它使用了axios、promise 等多种技术和原理来实现批量处理多个异步请求&#xff0c;并确保所有请求都能正确处理并报告其状态。 假设有一个场景&#xff1a;有一个任务列表&#xff0c;有单个任务的处理功能…

PyQt ERROR:ModuleNotFoundError: No module named ‘matplotlib‘

Solution:打开cmd输入指令下载malplotlib pip install matplotlib

2024-07-27 Unity Excel —— 使用 EPPlus 插件读取 Excel 文件

文章目录 1 前言2 项目地址3 使用方法3.1 写入 Excel3.2 读取 Excel3.3 读写 csv 文件 4 ExcelSheet 代码 1 前言 ​ 前几日&#xff0c;一直被如何在 Unity 中读取 Excel 的问题给困扰&#xff0c;网上搜索相关教程相对古老&#xff08;4、5 年以前了&#xff09;。之前想用 …

力扣高频SQL 50题(基础版)第二十五题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第二十五题619.只出现一次的最大数字题目说明实现过程准备数据实现方式结果截图 力扣高频SQL 50题&#xff08;基础版&#xff09;第二十五题 619.只出现一次的最大数字 题目说明 MyNumbers 表&#xff1a; ------…

wpf中轮询显示图片

本文的需求是&#xff0c;在一个文件夹中&#xff0c;放一堆图片的集合&#xff0c;然后在wpf程序中&#xff0c;按照定时的方式&#xff0c;循序显示照片。 全部代码 1.声明一个PictureInfo类 namespace WpfApp1 {public class PictureInfo{public string? FileName { get; …

【计算机网络】三次握手、四次挥手

问&#xff1a;三次握手 四次挥手 TCP 连接过程是 3 次握手&#xff0c;终止过程是 4 次挥手 3次握手 第一步&#xff1a;客户端向服务器发送一个带有 SYN&#xff08;同步&#xff09;标志的包&#xff0c;指示客户端要建立连接。 第二步&#xff1a;服务器收到客户端的请求…

Java设计模式—单例模式(Singleton Pattern)

目录 一、定义 二、应用场景 三、具体实现 示例一 示例二 四、懒汉与饿汉 饿汉模式 懒汉模式 五、总结 六、说明 一、定义 二、应用场景 ‌单例模式的应用场景主要包括以下几个方面&#xff1a; ‌日志系统&#xff1a;在应用程序中&#xff0c;通常只需要一个日…

Spring之Spring Bean的生命周期

Spring Bean的生命周期 通过BeanDefinition获取bean的定义信息调用构造函数实例化beanBean的依赖注入处理Aware接口&#xff08;BeanNameAware、BeanFactoryAware、ApplicationContextAware&#xff09;Bean的后置处理器BeanPostProcessor-前置初始化方法&#xff08;Initiali…

关于@JsonSerialize序列化与@JsonDeserialize反序列化注解的使用(密码加密与解密举例)

注&#xff1a;另一种方式参考 关于TableField中TypeHandler属性&#xff0c;自定义的类型处理器的使用&#xff08;密码加密与解密举例&#xff09;http://t.csdnimg.cn/NZy4G 1.简介 1.1 序列化与反序列化 学习注解之前&#xff0c;我们可以先了解一下什么是序列化与反序列…

115. 不同的子序列 dp入门(一)详细推导dp转移方程式

目录 1. 题目引入&#xff1a; 2. 动态规划解法 2.1 动态dp表示 2.2 动态方程推导: 2.3 具体分析 2.4 初始化 3. 代码如下 java版 c版 Python版 1. 题目引入&#xff1a; 给你两个字符串 s 和 t &#xff0c;统计并返回在 s 的 子序列 中 t 出现的个数&#xff0c;结果…

计算机基础(day1)

1.什么是内存泄漏&#xff1f;什么是内存溢出&#xff1f;二者有什么区别&#xff1f; 2.了解的操作系统有哪些&#xff1f; Windows&#xff0c;Unix&#xff0c;Linux&#xff0c;Mac 3. 什么是局域网&#xff0c;广域网&#xff1f; 4.10M 兆宽带是什么意思&#xff1f;理论…

OAK-FFC 分体式相机使用入门介绍

概述 OAK FFC 主控板和多种可选配镜头模组非常适合灵活的搭建您的3D人工智能产品原型。由于镜头是分体式的&#xff0c;因此你可以根据需要测量的距离&#xff0c;自定义深度相机安装基线&#xff0c;并根据你的项目要求&#xff08;分辨率、快门类型、FPS、光学元件&#xff…

项目风险管理:从理论到实践的探索

项目风险管理&#xff1a;从理论到实践的探索 前言一、项目风险识别二、项目风险应对策略三、综合应对策略结语 前言 在当今快速变化的商业环境中&#xff0c;项目管理已成为组织实现目标的关键工具。然而&#xff0c;项目的成功往往伴随着各种不确定性和潜在风险。有效的风险管…

【Git-驯化】一文搞懂git中rm命令的使用技巧

【Git-驯化】一文搞懂git中rm命令的使用技巧 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内容文档关注&#xff1a;微信公…

五、Spring Boot - 上手篇(1)

&#x1f33b;&#x1f33b;目录 一、快速入门&#xff1a;创建第一个SpringBoot 工程1.1 点击File--->New--->Project...1.2 选择版本和依赖的相关骨架包1.3 设置项目保存目录1.4 项目创建完成&#xff0c;工程主界面如下1.5 项目说明1.6 启动项目1.7 编写 HelloControl…

快速上手,spring boot3整合task实现定时任务

在已经上线的项目中&#xff0c;定时任务是必不可少的。基于spring boot自动装配的原理&#xff0c;我们要集成task定时任务还是非常简单的。只需要简单的两步就可以实现。 1、创建一个spring boot项目&#xff0c;并在项目的启动类&#xff08;也不一定非要是启动类&#xff…

如何排查GD32 MCU复位是由哪个复位源导致的?

上期为大家讲解了GD32 MCU复位包括电源复位和系统复位&#xff0c;其中系统复位还包括独立看门狗复位、内核软复位、窗口看门狗复位等&#xff0c;在一个GD32系统中&#xff0c;如果莫名其妙产生了MCU复位&#xff0c;如何排查具体是由哪个复位源导致的呢&#xff1f; GD32 MC…