影子测试模式
同时部署和运行新版本和当前版本,对用户隐藏新版本,用户实际发起的请求会在测试环境中产生镜像并重放。
重放方式:实时|异步
影子测试需要确保不会触发可能改变现有生产环境或用户状态的负面效果
主要优势
- 生产环境无影响
- 使用生产负载测试新版本后端服务
- 降低部署风险
- 版本迭代频繁,基于有限的测开比下结合自动化测试提高效率
流量采集
流量来源:实时捕获|日志系统
实时捕获可以通过开源的流量回放工具实现,例如Goreplay
项目地址:https://github.com/buger/goreplay
架构图:
具体实现:在生产服务器上启动gor进程负责监听、过滤和转发
sudo ./gor --input-raw :8000 --output-stdout http http://staging.env
针对于服务既有的日志系统进行流量采集会具有更高拓展性
采集方式:基于时间分页使用HTTP请求日志系统
流量池:生成文件|数据库存储
{
"_source": ["timestamp", "request", "response"],
"query": {
"range": {
"timestamp": {
"gte": "now-1d/d",
"lt": "now/d"
}
}
}
}
日志格式提取
{
"timestamp": "%Y-%m-%d %H%M%S.%f",
"request": {
"method": "GET",
"url": "/api/path",
"headers": {
}
"body": ""
},
"response": {
"status": 200,
"headers": {},
"body": ""
}
}
冗余流量过滤
基于不同的考量因素进行规则过滤:例如时间窗口等
转发流量则可以基于上述的开源工具Goreplay实现:
sudo ./gor --input-file request.gor --output-http="http http://staging.env"
另外的开源工具:OpenDiffy
项目地址:https://github.com/opendiffy/diffy
实现原理:
java -jar diffy.jar \
--candidate='localhost:9000' \
--master.primary='localhost:9100' \
--master.secondary='localhost:9200' \
--allowHttpSideEffects='true' \
--responseMode='candidate' \
--service.protocol='http' \
--serviceName='DiffyService' \
--proxy.port=8880 \
--http.port=8888
选项含义:
-- candidate:被测版本代码的实例地址
-- master.primary:稳定版本运行的实例地址
-- master.secondary:稳定版本运行的实例地址(用于噪声消除作用)
-- proxy.port:端口接收Request并重定向至各个实例
-- http.port:工具的UI端口
Goreplay是监听网络接口上的流量,不需要更改生产基础架构,而是在与服务相同的计算机上运行 守护程序
OpenDiffy则是通过代理实现流量的转发
流量分析
DIFF算法设计
- 分析来源:转发流量响应(预发环境)
- 对比来源:转发流量(生产环境)
算法逻辑:
- 响应字段对比
- 性能对比
关于AADiff问题
生产环境与预发环境在进行DIFF对比之前,可能存在的自身因素影响,即AA两次请求之间的流量存在差异,影响了后续的校验
存在的一个解决方法:流量回放至与生产环境或同版本代码的实例中,进行字段缺省以及数据波动率计算
考虑点
- 预发环境和生产环境的配置库需要隔离,避免数据污染
- 流量回放高度依赖于配置库和数据库
- 针对AADiff问题的解决方式可能对于生产环境会造成一定的查询压力
- 实时查询数据时,回放结果存在一定的波动率,需要有比率判定准则
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。