影子测试模式

同时部署和运行新版本和当前版本,对用户隐藏新版本,用户实际发起的请求会在测试环境中产生镜像并重放。

重放方式:实时|异步

影子测试需要确保不会触发可能改变现有生产环境或用户状态的负面效果

主要优势

  • 生产环境无影响
  • 使用生产负载测试新版本后端服务
  • 降低部署风险
  • 版本迭代频繁,基于有限的测开比下结合自动化测试提高效率
sequenceDiagram
流量管理->>生产环境: 流量捕获
生产环境-->>流量管理: 流量返回
流量管理->>流量管理: 流量清洗、过滤
流量管理->>DIFF: 流量转发
DIFF->>预发环境: 流量转发
预发环境->>DIFF: 流量返回
DIFF->>DIFF: 流量分析

流量采集

流量来源:实时捕获|日志系统

实时捕获可以通过开源的流量回放工具实现,例如Goreplay

项目地址:https://github.com/buger/goreplay

架构图:

image.png

具体实现:在生产服务器上启动gor进程负责监听、过滤和转发

sudo ./gor --input-raw :8000 --output-stdout http http://staging.env

针对于服务既有的日志系统进行流量采集会具有更高拓展性

graph LR
id1([日志系统]) --> 获取流量
获取流量 --> id3{是否处于白名单}
id3 --> |是| 获取流量
id3 --> |否| 流量清洗
流量清洗 --> id5{是否清洗成功}
id5 --> |否| 获取流量
id5 --> |是| id6([流量池])

采集方式:基于时间分页使用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

实现原理:

image.png

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两次请求之间的流量存在差异,影响了后续的校验

存在的一个解决方法:流量回放至与生产环境或同版本代码的实例中,进行字段缺省以及数据波动率计算

sequenceDiagram
流量管理->>生产环境: 流量捕获
生产环境-->>流量管理: 流量返回
流量管理->>流量管理: 流量清洗、过滤
流量管理->>DIFF: 流量转发
DIFF->>生产环境: 流量转发
生产环境-->>DIFF: 流量返回
DIFF->>预发环境: 流量转发
预发环境-->>DIFF: 流量返回
DIFF->>DIFF: 流量分析

考虑点

  • 预发环境和生产环境的配置库需要隔离,避免数据污染
  • 流量回放高度依赖于配置库和数据库
  • 针对AADiff问题的解决方式可能对于生产环境会造成一定的查询压力
  • 实时查询数据时,回放结果存在一定的波动率,需要有比率判定准则

sayornottt
1 声望0 粉丝

姑且是测试开发工程师.