得物流量录制回放实践
如果无法正常显示,请先停止浏览器的去广告插件。
1.
2. POIZON
2018年硕士毕业武汉大学
拥有5年的后端开发经验;曾任职美团、喜马拉雅,
现任于得物,主要负责流量录制回放平台
3. POIZON
01 基本介绍
02 平台成果
03 业务架构图
04 预发不 mock 回放
05 线下 mock 回放
06 稳定性
07 应用场景
08 展望
4.
5. 什么是流量回放
流量回放vs接口自动化
流量回放 接口自动化
用例编写 人工写代码 自动
维护成本 高 低
检查点 人工定义-关键字段 1.自动-Response全文
2.自动-子调用入参
业务逻辑测试 支持 支持不好
覆盖率 人工准备场景 真实流量
不计成本:接口自动化>流量回放
相同成本:流量回放>接口自动化
6.
7. 接入应用
数
平台发现
问题
技术改造
节省人日
8.
9.
10.
11.
12. Redis write
mock
Send mq
mock
Mybatis insert
mock
•接口中含有Redis部分写操作(没有其他写操),这种情况也可以
标记只读。在回放过程中针对这种情况平台也会进行mock
•接口中含有发mq消息(没有其他写操作),这种情况也可以标记
为只读。在回放过程中针对这种情况平台也会进行mock
•接口中存在写日志(mybatis insert), 这种情况也可以标记为只读。
在回放过程中针对这种情况平台也会进行mock
13. 结果差异比对
忽略数组顺序影响
排除无需比对字段
将 Response 的 json
14. 接口维度 + 差异字段分组
只有新增
只有删除
只有内容变更
新增&删除
删除&内容变更
新增&删除&内容变更
15. 问题
如何解决小流量场景(稀疏流量)的录制问题?
背景
受限于业务方的接口的qps、平台接口采样、平台限流及生产机器集群(只会录制其中某一台机器)的缘故,
导致稀疏流量(小流量)很难被采集到,那么流量未覆盖的场景会变成未知的风险。以下主要针对读接口
中稀疏流量(主要是接口维度的小流量问题)
解法
16. 问题
如何避免生产数据污染?
背景
预法回放是不mock回放,如何触发写操作,可能导致污染生产环境的数据(目前我司生产和预发共用一套数据库)
解法
【人工】只读接口 【自动】平台回放前对 【自动】平台回放中对疑似
人工确认 疑似写操作拦截 写操作拦截并阻断回放
遗留问题
Ø 没有被沙箱切到的子调用无法拦截,如使用httpcomponents客户端的http
Ø 目前只能对回放应用本身写操作拦截,无法拦截下游应用的写操作
17. 问题
如何解决跨服务下读场景的写操作问题?(流量标识)
背景
预发不mock回放可能会影响某些业务,如数据埋点、算法的推荐模型等
解法
在链路上下文中添加流量标识,以便区分正常流量和流量回放的流量
其他应用场景
根据回放标识,业务可以定制回放流量的处理逻辑
Ø 影子表方案实施
Ø 写保护操作
Ø 不同的限流操作
Ø 不同的日志策略
18. 在实际的使用过程中发现存在以下问题,虽然录制回放很多流量,但是这些流量覆盖哪些场景,用户是无法感知的。原因是
没有衡量指标,就无法放心使用其进行回放。如何衡量这个回放结果是否可靠?
方案 概念 优势 劣势
接口维度覆盖率 已覆盖接口/所有的接口 简单 不能很好衡量,粒度比较粗
场景(标签)维度覆盖率 已覆盖场景/所有的场景 场景有具体的含义 标签管理维护比较困难和耗时
代码覆盖率 将使用一个或多个标准来确定在执行测
试期间代码是如何执行的,指标有:函
数、分支和行覆盖率等 在定义程度上可以
反衡量你的代码 不能够准确的衡量,原因只能覆盖读的场景
19.
20.
21. Ø
Ø
检查点一:对录制的子调用与回放的子调用参数匹配,如case1、case2、case3等
检查点二:将录制的Response与回放的Response进行diff,如case4
22. 结果差异比对
自动忽略时间的差异
忽略数组顺序影响
排除无需比对字段
将 Response 的 json
23. 接口
Ø 接口维度覆盖率
失败原因
Ø 多调用-参数不一致
Ø 多调用-uri不匹配
Ø 少调用
失败字段
统计报告
Ø $.xx字段比对差异 Ø 失败分类饼图
Ø 失败结果饼图
Ø 流量回放统计数据
覆盖率
Ø 子调用链路覆盖率
Ø 代码覆盖率
24. 问题
如何解决嵌套录制导致回放失败问题
背景
一些中间件、第三方框架或业务自己封装的框架可能会出现两个嵌套的子调用(平台切的两个切面),
由于录制会录制到两个子调用,但是回放只会匹配到外层子调用(mock掉,不会调用嵌套在里面的
子调用),导致回放失败。
解法
对于嵌套录制子调用,可以通过只录制嵌套外层的子调用,不录制嵌套在里面的子调用,即可解决上面的问题
25. 问题
如何解决时间差异带来的回放失败问题
背景
在一些业务服务逻辑中存在和时间相关的逻辑,由于录制的时间和回放的时间不一致导致回放失败。
解法
平台这边目前有两种解法,第一种解法通过将时间还原到录制的时间,但是这种解决不了,毫秒级别导致回放;
第二种解法通过自定义子调用(自定义切面),通过mock的方式来解决毫秒级别导致回放失败,但是这种方式可能
存在缺点是业务可能要改造。
26. 问题
如何解决系统噪音带来的回放失败问题?
背景
在业务服务中里面会存在一些requestId、traceId等通用噪音字段,这些噪音字段导致回放失败。
解法
通过平台支持的全局、应用、接口级别的噪音字段配置,通过这三种方式解决通用字段和业务系
统个性化噪音字段,从而提高回放的成功率
27.
28. 风险点
沙箱挂载
沙箱挂载机器cpu飙高
生产环境只允许一台机器
平台措施
沙箱挂载平台巡检
稳定性
开启录制可能会导致死锁
风险点
录制在一定程度上消耗cpu和可
能增加rt
录制
流量录制预热
平台措施
只读接口只录制关键信息
录制过程进行监控,异常降级
29.
30. 功能迭代需求回归
技术改造
服务迁移或重构
31.
32. 增加数据来源
33. 预发不mock回放
线下mock回放
稳定性
34. POIZON
THANKS