1、Golang流量回放及场景化度量实践易品字节跳动 服务端测试开发工程师易品字节跳动 PDI-质量技术 服务端测试开发工程师先后在滴滴、字节质量架构工作,现任字节服务端测试技术负责人,深耕泛自动化领域&LLM测试技术领域,在接口自动化、流量回放、测试充分度度量等方向,孵化打造多款质量基建产品,有丰富的质效解决方案设计及落地经验目录01CONTENTS0203背景简介待解决的问题解决方案04实践落地总结展望0501 背景简介业界调研产品建设分析业务诉求阿里Java系:生态成熟,语言特性限定 原理:运行时AOP录制回放 能力:单模块全包围mock 应用:蚂蚁/天猫/淘宝/阿里云广泛使用,其中Repe
2、ater开源,Doom已toB滴滴Go系:思路可参考,关联缺失,侵入大 原理:运行时net库hook录制回放(字节自研netpoll)能力:单模块全包围mock,完成度一般(各种复杂业务场景不支持,如协程池、内存调用)应用:网约车内部重构应用,已开源旁路网卡系:语言不限,不支持写接口及低成本Mock 原理:网卡层/MeshProxy层录制 能力:入口Inbound录制回放,字段/统计类Diff 应用:字节内有ByteCopy,业界GoReply业界落地多,有助于业务测试模式升级,建设核心围绕高覆盖、低成本 业务意义:创新突破型测试能力,更高测试效率、更低测试成本,协助业务跑的更快、交付质量更高
3、 能力诉求:高覆盖、低成本,能应用于回归、自测等阶段,可度量、可扩展的完整测试方案02 待解决的问题基础建设:Golang流量回放主链路能力提升:降低成本、提高覆盖 怎么录制流量,包括读写接口、一个请求的完整上下文 怎么回放流量,包括路由决策、mock匹配及动态调整录制层级:越往上定制化越多,越往下关联难度越大上下文关联:流量并发情况下将一个请求完整调用关联在一起回放路由策略Mock怎么导流到mock服务Mock怎么正确匹配录制的流量动态修改怎么适配线下回放的差异性?存储类、rpc下游新增调用?接口异构?无法直接mock怎么处理03 解决方案-录制TCP 层录制流量:录制节点发生在 Golan
4、g 网络库的读写操作,Inbound 为 Server 交互,Outbound 为服务作为 Client 对外调用交互 流量关联方式:基于 GoroutineId+LogId+SocketFD,其中异步请求通过新增委派 ID 关联 golang 父子协程03 解决方案-回放回放路由机制:重定向:修改Syscal.Connet实现 自定义mock 逃逸/自己配置:解决线上、线下差异性问题,主要是rpc,序列化/反序列化 代理:主要解决redis、db在线上、线下不一致问题Mock匹配机制:初筛:服务、方法、协议一致性 加权相似度:基于n-gram相似度,对不同网络协议有加权 Sql单独处理:表字
5、段、操作加权-json化-相似度匹配03 解决方案-源头降噪解决问题:非网络类调用,golang无aop机制实现原理:异步存非网络调用的方法出参、入参;回放时解析cxt,命中且入参一致,直接返回出参解决问题:多批次同一请求,golang map随机性实现原理:回放请求拆包,还原为线上录制的顺序03 解决方案-diff消费降本解决问题:单次任务diff重复标注实现原理:基于多维度的特征(psm、method、jsonpath、env.)进行同质diff聚类。Diff标注压缩比接近100:1解决问题:多次任务diff重复标注实现原理:提供了噪音模板功能,支持临时/永久噪音识别标注基于 用户历史标注
6、+旁路识别非幂等字段解决问题:降低diff标注的分析决策成本实现原理:规则诊断、风险分类、辅助debug信息03 解决方案-代码覆盖率演进随机、靠量级接口加权引入场景流量训练以量取胜以量取胜 实时流量 半小时+的回放时长 覆盖率波动较大,整体偏低训练优化训练优化 训练流量为主、实时为辅 旁路单条流量训练,去重保优 训练分母策略优化,如高峰期优先 线上代码覆盖率的90%+,15min回放时长代码代码+场景场景实时实时+接口接口 实时流量为主,引入流量分桶 20min+的回放时长 覆盖率有阶梯提升代码代码+场景场景 流量用例集 异常场景,如状态码 逐步发展为完整的业务场景方案 10min的回放时长