自研流量回放工具原理及在广告业务的应用实践
如果无法正常显示,请先停止浏览器的去广告插件。
1. 自研流量回放工具原理及
在广告业务的应用实践
分享人:李茂森
2. 个人简介
•姓名:李茂森
•所在组织:技术中台-质量工程部
•专业领域:服务端测试
3. 目录
01 业务背景及测试挑战
02 自研流量回放工具FlowCopy介绍
03 流量回放在广告业务中的应用
04 总结与展望
4. 01
业务背景与测试挑战
5. 广告投放系统介绍
广告系统技术特点
高并发
• 亿级PV
• 万级QPS
低时延
• 处理时间<100ms
• 传输数据量大
链路复杂
• 大型分布式系统
• 对外为HTTP接口
• 多模块之间频繁RPC通信
6. 测试挑战
随着系统复杂度的提高,传统自动化测试的弊端凸显
高成本
人工编写自动化脚本,耗时高
需求变动较快,自动化脚本维护成本高
自动化脚本质量与QA个人经验和能力强相关
覆盖场景有限
自动化脚本只覆盖核心场景
特殊场景(第三方/模型依赖)覆盖难
效率低
排查自动化问题效率低,赋能RD效果差
7. 02 自研流量回放工具FlowCopy介绍
8. 流量回放介绍
简单来说,流量录制与回放是通过复制线上真实流量
(录制),在测试环境进行模拟请求(回放)
相对于传统自动化测试,流量回放技术可明显提高测试效率
低成本
无需人工编写自动化脚本
使用工具录制回放流量,维护成本低
覆盖场景全面
使用真实流量,覆盖大部分场景
定制筛选特殊流量,辅助人工测试
效率高
大量真实请求测试,快速定位问题
9. 广告业务测试中的流量录制回放需求
广告引擎流量录制回放需求:
• RPC协议支持
流量的录制需要支持多种RPC协议,如Thrift、Brpc等
• 明文流量录制
多数RPC协议为二进制,需要录制为明文流量
• C++语言支持
尽量的多语言支持,必须能够录制C++相关应用
……
现有流量回放工具是否能满足需求
10. 现有流量回放工具介绍
优点:
优点:
不仅支持流量回放,还可以扩展到sandbox的其它能力
通用的录制/回放能力,多协议支持
强大的debug功能,支持内部调用链的追踪
不足:
只适用于JAVA类应用
有一定上手难度,熟悉JAVA/JVM
是否满足需求:
业务无侵入,因为intercept的存在,实时导流对线上影响小
基本tcp协议栈的协议都可以支持,几乎是目前支持协议最多的
流量回放工具
基于ip层发送,流量更加真实
支持分布式架构,可以当作压测工具使用
不足:
部署难度大,需要同时部署tcpcopy和intercept,参数较复杂
录制和回放都是基于底层数据包,难以进行流量的筛选和定制
优点:
安装部署简单、对业务应用无侵入,只占用机器带宽
支持过滤和修改流量,可实时转发流量
支持回放速率控制,可用于性能测试
不足:
开源版本只支持HTTP1.1及以下协议
无法解析二进制的数据交互协议,如Protobuf等
是否满足需求: 不满足,无法录制RPC协议
不满足,不支持C++应用
是否满足需求: 不满足,无法录制明文流量
11. 流量回放的演进之路
1.0
基于应用层录制
2.0
基于网络协议栈录制
12. 流量回放1.0
背景:
业务测试中需要明文流量,但现有工具无法支持RPC流量录制
实现方案:
1、人工在业务系统中插入代码并编译
2、搭建测试环境后,使用tcpcopy等工具在系统入口处回放流量
存在问题
1、系统代码变更,需要同步修改编译,维护成本高
2、侵入式保存流量,可能影响程序功能
3、依赖真实测试环境配置,环境搭建成本高
4、测试环境配置会影响流量保存的真实度
13. 流量回放2.0
无侵入式保存HTTP/RPC明文脱敏流量,支持千级QPS流量保存/改写
14. FlowCopy架构
通过网络协议栈获取流量,无侵入
使用epoll多路复用加多线程处理,高性能
HTTP/RPC多协议支持,明文脱敏流量存储
录制请求流量无需测试环境
15. FlowCopy使用
以GRPC接口录制为例:
1、无需手动编译proto文件,运行指定方法名称即可
2、无需真实测试环境,以JSON格式存储protobuf请求数据
3、支持转发到特定服务,获取相关返回流量
FLowcopy
线上服务
流量录制
参数 字段 描述 示例
服务转发地址 req_addr 需要转发gRPC服务的
IP地址 127.0.0.1,为空则不转
发
服务端口 port gRPC服务的端口号。 50051
1、启动flowcopy,机器ip为192.169.5.3
--req_addr=192.162.1.2:8000
--port=8000
--timeout=1000
--method_name=example.personSerivce/sendrequest
--output_filename=./dump.json 请求超时时间 timeout 单个请求的最长转发时
间,单位为毫秒。 5000
method_name gRPC方法的全名。说
明
格式为包名.接口名/方
法名。 package.service/met
hod
2、启动tcpcopy,目标ip为flowcopy机器ip
tcpcopy -x 8000-192.169.5.3:8000 -s 192.168.5.4 -c 192.168.1.x proto文件名 proto_name grpc方法所在 a:1,b:2说明
多个元数据以半角逗号
(,)分隔。
流量输出路径 output_filename 流量存储的文件名称 ./dump.json
零代码编写、一键录制!
方法名
16. 技术难点-明文流量录制
HTTP协议多为明文传输,Protobuf、Thrift等二进制数据传输格式,如何用明文表示?
IDL序列化为JSON格式
为什么使用JSON格式:
1、JSON格式较主流,易于构造和阅读
2、目前IDL多为TLV(Tag | Length | Value)格
式, 方便转换
注意:
1、暂无通用序列化方式
2、自研序列化时需制定统一的转换规则
// Person.proto // Person.json // Person.thrift
message Person {
required string userName = 1
optional int64 favoriteNumber = 2;
repeated string interests = 3;
} { struct Person{
1: required string userName,
2: optional i64 favoriteNumber,
3: optional list<string> interests
}
}
"userName": "Martin",
"favoriteNumber": 1337,
"interests": ["daydreaming", "hacking"]
17. 自动化流量录制
流量录制
• 流量脱敏采集,千万级存储,随用随取
• 全自动化录制,无需人工干预
• 自动更新废弃数据,周期执行
• 通用JSON数据格式,相关测试工具直接使用
18. 03 流量回放在广告业务中的应用
19. 流量回放的应用-Diff测试
整体思路:
• 获取线上真实流量
• 使用自研工具,在不同的环境进行请求回放
• 对比接口的返回结果
优点:
• 基于线上真实数据,覆盖场景全面
• 效率高,快速发现问题
• 操作简单、标准化程度高
20. Diff测试-应用举例
系统重构测试:
测试场景:系统的重构或迁移,整体功能不变或变动更少,DIFF测试可快速发现问题
问题举例:XX服务重构项目中,90%问题通过DIFF测试发现,大幅节省QA时间
功能回归测试:
测试场景:新功能提测,DIFF测试保证历史逻辑不受新代码影响
问题举例:XX服务新功能代码修改,新功能实验关闭下存在较多Diff,排查后发现代码逻辑有误
新功能验证测试:
测试场景:新功能提测,可以通过DIFF测试结果,判断是否功能符合预期
问题举例:对于XX服务效果提升类DIFF测试,针对特定字段结果分析,判断功能不符预期
……
21. Diff测试应用中遇到的问题
数据一致性: 第三方/下游依赖:
• 除了程序bin文件,其它配置/数据需要完全相同 • 录制流量时,需要同时录制请求对应的响应数据
• 可利用容器数据卷,Apollo同步等方式实现 • 配合自研MockServer进行测试
程序逻辑随机,特殊字段处理: 核心数据脱敏:
• 程序逻辑存在随机?配合RD进行业务去随机开关 • 录制流量时,对敏感数据做预处理,确保数据加密和脱敏
• 时间戳等动态变化字段?结果预处理,黑白名单规则、浮点截断…
• 返回数组格式顺序不一致?复杂数据排序,JSON-Schema规则对比…
…….
22. 流量回放的应用-性能测试
整体思路:
• 线上获取流量
• 使用自研工具,在测试环境对程序进行性能测试
• 对比不同版本的性能结果
优点:
• 真实流量压测,结果指标可信度强
• 可筛选特定流量,按需压测
• 完全节省压测请求构造时间,随用随压
23. 性能测试-应用举例
上线前性能卡点:
测试场景:对于测试服务上线前进行性能测试,得到的结果与基线版本(线上)对比
问题举例:XX服务在QPS300情况下平响时间上涨18%,排查为代码逻辑缺陷导致,修复后上线
性能专项验证:
测试场景:对于性能优化的需求,可基于性能测试得到的结果反复优化,以达到预期目标
问题举例:XX服务性能优化项目,QPS800下压测平响时间降低8%,TP99时间降低12%,与上线后数据基本一致
程序稳定性测试:
测试场景:对于测试服务上线前可进行稳定性测试,提前发现导致程序崩溃等严重的问题
问题举例:XX服务在压测后进程崩溃,分析Coredump后发现多线程处理异常逻辑,修复后上线
……
24. 流量回放的应用-功能测试&问题排查
整体思路:
• 线上获取流量
• 使用自研工具,在测试环境对程序进行请求
• 观察测试环境返回或日志,排查问题
应用举例:
• 功能测试:根据线上真实请求,转换为测试请求
• 问题排查:基于线上问题场景,快速筛选流量进行排查
25. 应用数据
流量回放相关测试技术建设至今,已经应用于360广告投放引擎的所有模块,完全
嵌入功能、性能及Diff测试流程,成为引擎端QA质量保障的重要手段
流量存储级别
1000 w+
接口覆盖率 发现问题数量
100 % 500 +
26. 04
总结与展望
27. 未来展望
推广到更多业务
• 更多业务推广,提升工具ROI
• 完善接口规范和使用说明
平台化/服务化
• 更好结合现有测试平台,实现流量回放平台化
• 结合流水线能力,实现服务化
流量回放3.0
• 探索基于ebpf的云原生流量回放方案
• 降低部署难度,提高功能丰富度
• 智能流量采集…..
28. THANK YOU