阿里QA导读:火箭发射、奥运会开幕式、双十一0点大促(或视频、OTA等网站的关键营销活动),面临这些极其重要的时刻,负责人总是会想法设法保证稳定,最理想情况是可以真实模拟演练。众所周知,发射和开幕式无法模拟或者成本很高,但在软件领域这却成为可能,阿里巴巴技术质量的星斩、靖北、晟枫、成章同学为我们带来“安全、便捷、0入侵的未来可测解决方案”。
1 未来时间可测性的基本原理
以商品优惠为例(如下图)
- 正常情况下,因为当前时间和活动时间不重叠,自然看不到该活动;
- 穿越逻辑:设法修改当前时间(java中大部分场景体现在new Date())和活动时间重叠;可实现的手段有:修改系统时间、修改业务代码逻辑(通过入参方式获取等);
now
now
营销活动时间范围
时间
边界和限制(风险)
如果某功能链路是通过缓存查询活动(且穿越用户第一次访问),则存在以下两种风险:
暂且称类似链路为风险链路(文章后续也会用到该概念,请关注,文章尾部有一幅图片详细介绍了风险链路的各种分支情况)
- 当前活动丢失,线上真实的营销活动不生效;
- 如果上层代码使用营销活动的逻辑未进行严格时间校验,则会变成提前享受活动
now
Text
营销活动时间范围
时间
营销活动时间范围2
2 现有解决方案和优缺点分析
2.1 隔离环境方案
通过链路路口路由到一个特定环境中,该环境只有特定的白名单才能调用进来,不影响线上普通用户。通过类似修改jvm时间并重启的方式,起到穿越的效果。
隔离环境,只有
普通线
特定白名单用户
入口路由
上环境
才能路由进来.
应用1
应用1
应用2
应用2
应用3
应用3
好处:对业务系统无入侵;
缺点:
- 会对所有的new Date()进行时间修改,在风险路径下会影响线上功能;
- 每次使用准备较长,且如果测试不同的时间点,需要重启多个应用,成本较大;
- 保证环境隔离性有较大的成本和风险,包括异步消息和任务等;且除了入口没有在各应用上做白名单校验;
2.2 零售通二方库解决方案
以二方库的形式提供给原本需要改服务器时间的应用,只需引入二方库并用其中的futureUtils.getdate()替代new Date()方法即可,通过diamond控制白名单和指定时间(下图红色背景部分)
diamond注释:管理持久配置的系统,应用不仅可以在启动时从diamond获取相关的配置,而且可以在运行中对配置数据的变化进行感知并获取变化后的配置数据
优点:只需要操作链路中关键节点,无流量隔离风险和其他风险,易用性有所提升。
缺点:对业务代码有少量的入侵。
用二方库的
FutureUtils.getDate(userld)
替代newdate
产品控制台
二方库
diamond总控
是否是预发环境
用户白名单
返回JVM时间
返回指定时间
3 未来时间可测的3大要求
核心
补充说明
优先级
具体点
难点
L.缘存风险(只能进行锋路级别穿否则穿越数据可能影响正常缓存,造成线上功能异常;
P1
安全
P1
确保线上流量或非测试用户的绝对安全;
1.2每个节点,白手单校验
链路较长且依赖底层,则第一次梳理配置成本较高(一次性)
P2
便捷
2.1链路梳理成本低
测试过程中测试不同时间,且链路间不互相影响,因此必须快速P2
2.2不同时间,不同链路切换成本
生效,也是进行穿越自动化的基本要求;
P2
2.3环境ready成本
PI
整个产品方案的基本要求
0入侵
3.1不入侵可以修改newDateO
否则只有业务改造,该链路才支持穿越:
失去很多应用场景
3.2有缓存风险时,如何0入侵穿越:
普通可用性要求,否则每个链路都要写不同注入逻辑;
3.3如何通用性的获取用户白名单:
4 月光宝盒解决方案
月光宝盒目前已解决上述3大难点中的8个问题点,原理如下,过程中会用到一个关键的工具:jvm_sandbox,它实现了一种在不重启、不侵入目标JVM应用的AOP解决方案,是阿里已经开源的一个软件。
具体原理:有以下两个调用链路,其中链路2是风险链路,穿越后会影响线上功能。应用3中包含了两个hsf方法即需要代码注入(含new date() 的关键逻辑),其中链路中应用2是不需要做任何处理。
代码注入1:从链路的某个节点获取用户id
判断是否与期望的测试账号id匹配,如匹
代码注入2:对该接口的调用进行染色标记
配则标记并向后续链路传递.
并向后续链路传递;
链路1
接口1
代码注入3:对newdate构造函数进
行字节码增强,只有同时包含白名
单标记和安全接口标记的链路,会
应用3
应用2
应用1
对newdate的返回值进行mock;
接口2
接口1与接口2均含有new
链路2
Date(逻辑,但是接口2不能注
入,否则可能引起功能问题;
班
整体思路如下图:
1)通过字节码增强方式解决上表3.1问题,即把所有new Date()返回值mock到穿越时间。但是会碰到2个安全问题(即上表中1.1和1.2)
- 如何只对某个账号的进行mock(白名单过滤),即不能影响非穿越测试账号;
- 如何只对链路1的new Date()进行mock,而链路2的不mock,即不能影响功能;
2)在前置链路中做特定标识并向下透传
- 在链路中某一处可以通过固定的方式取到用户id,如果跟预期的测试id相一致,则标记染色后通过中间件向后续链路透传。(不同公司不同架构,因此如何取到用户id的方式也不同)
- 对应用3的接口1进行标记染色,并向下透传。
3)对步骤1中的new Date()增加逻辑判断,只有符合白名单的、且从期望链路过来的,才进行mock。
基于上述思路可手动对某条链路功能进行穿越测试,月光宝盒把上述内容进行了产品化,同时过程中通过产品的设计和选型也部分解决了便捷性问题(即上表中的2.2和2.3);整体产品结构和部分demo如下所示;结合上图的原理及下图 “月光宝盒”的产品功能和使用步骤可以方便理解。
业务系统
自动化平台
应用1
月光宝盒平台
注入
应用与节点管理
链路自动梳理
链路管理
应用:
模块
lst-targetad
代码
部薯/激活
缓存风险
一键激活/失效
一键部署
自动排除
测试账号和时间
中间应用n
注入
jivm-sandbox
互动应用
模块
代码
4.1 添加链路&设置节点信息模块
配置链路信息
慢作
创际时间
负五人
谱路名称
归属bu
202008210953:03
红包南锁路
查看节点部香激活滩试
未厨香
查看节点部著激活薄试
202008210953:03
柏奖售路
未动店
查看节点部暑激活渊试
2020-09-141107:43
摆素标签展示
末秘
链路中包含以下节点信息:
查看节点
类型
英名
节点名
方法名
所属bu
应用名
已激活
一
零售通
lst商品标签链路
INTERFACE
已漱活
已激活
lst搜索结果页标
未部著
零售通
ENTRANCE
签
未部署
对应原理图中,这两个节点分别分别起到了获取用户id和标记链路的作用。
4.2 部署月光宝盒的 jvm_sandbox实现模块
在配置好链路和节点信息后,可直接点击链路列表上的“部署”即可满足把月光宝盒注入代码部署到到对应节点的应用。可在节点信息的部署状态中查看各节点ip的部署情况。模块功能特点:
- 只影响某个节点,而非整个应用;
- 每个节点上面都包含了白名单的控制,更加安全可靠;
- 同一链路同一时间点可支持不同账号测试不同未来时间;同一账号在不同链路,互不影响,相互隔离。
点击“激活测试”后可输入用户名和要测试的未来时间,随即可进行功能测试;
激活测试
X
账号:
失效
检测
b个人测试账号006
时间:
请选择日期
取消
确定
4.3 链路梳理成本和缓存问题
从上述原理图中看出,我们在整条链路中只需要关注少数几个应用做增强,大量的链路是无需关心的,那么如何识别出需要注入的应用呢?尤其里链路涉及到其他底层BU的时候,梳理和识别会产生一定的使用成本;
如果正好碰到了风险链路,是不是只能做业务系统的改造排除风险,才能使用呢;如果不解决会大大减少月光宝盒的应用场景。
上述两个问题月光宝盒项目组也已经通用化解决,目前正在融入产品建设中,预计11月底12月初可用,支持双12的场景。
4.4 链路梳理成本和缓存问题
通过上述介绍,月光宝盒可以支持链路的提前创建,并提供了api完成链路中节点的部署和针对某账号的激活,笔者便思考能否结合业务系统,提供运营自检能力。整体解决方案如下,并在零售通的首页和红包雨场景下进行应用
步骤如下:
文
2.自动化用例的
3.业务场景
1.月光宝盒链路Id
详细触发链接
技术配置
月光宝盒
业务系统
1,部署和激活
传入时间
预览验证
链路
系统层面
2,运行相关自
动化用例
确认正常
运营操作
&自检
跳转
让运营同学确认
(签字画押)
用户感知层面
真实页面截图
(自动化运行结果页)
- 技术配置具体业务场景对应的月光宝盒链路,创建自动化用例并把触发链接与前面的链路id关联,最后在业务设置系统上提供“预览验证”和“确认正常”的按钮,与月光宝盒的链路id关联。
- 运营配置完成后,可通过预览验证看到在未来时间活动生效下的价格、效果等信息。
PS:原来大促中发现运营配置错误时,听到的最常见的一个说法是这个系统太复杂了,要设置系统1获得id1然后再设置系统2获得id2再¥%……&。现在没有理由了
下图是零售通红包雨设置场景,因为配置复杂度较高易出错,因此优先试点。关联了零售通无线自动化平台天雀的效果。(部分场景可直接通过自动化断言)
序列号:FEC5T19A16024125
W:andrcid
苏统版本:10分桥年10802340
迅尚信市:
ID:93
说籽状态
异宁0]
失度(0)
版功门7
全韵(8
Tins:点击页面标恩可以显示不同设备对比图
器等待10秒
右江第二次
账侧计时5秒
右沿第一次
左滑萄一次
左沿第二次
嗪501
?
?
双有纸青红S
红包即将来袭
4.5 产品最新进展
- 目前基础产品建设已经完成,支持了零售通双11中导购、互动、营销等多个场景及B系其他bu的部分场景,产品支持同一链路同一时间点下不同账号测试不同未来时间;同一账号在不同链路,互不影响,相互隔离.针对不可穿越的链路(如缓存风险),探索验证并提供了高效的改造解决方案。
- 未来一方面会赋能更多场景支持技术人员的穿越验证;另一方面 会跟业务系统打通与自动化相关系统打通,让运营进行关键配置时,就能实时查看并自动验证未来的效果。
5 结束语
- 本文由零售通技术团队多位作者共同完成,感谢技术风险部、淘宝和企业金融相关同学在过程中多次有建设性的讨论和jvm_sandbox团队同学相关同学支持。
- 欢迎有兴趣的小伙伴加入零售通技术团队,诚招服务端、客户端、数据算法及工程效能测试工程师和java开发工程师,微信:bondyu001 邮箱:chengzhang.yucz@alibaba-inc.com
关注「阿里巴巴技术质量」阅读更多