流量重放
流量录制
数据采集
- 业务代码
- rpc 框架
- 字节码增强
- 语言标准库
- tcp/ip协议栈
从上到下 流量特征依次减少,侵入性依次降低
java 技术栈首选字节码增强
开源实现:https://github.com/alibaba/jvm-sandbox-repeater
对于Java调用,一次流量录制包括一次入口调用(entranceInvocation)(eg:HTTP/Dubbo/Java)和若干次子调用(subInvocations)。 流量的录制过程就是把入口调用和子调用绑定成一次完整的记录
需要考虑解决的核心问题:
- 快速开发和适配新插件
- 开放插件定义enhance埋点/自定义调用组装方式快速实现插件适配
- 绑定入口调用和子调用(解决多线程上下文传递问题)
- 基于TTL解决跨线程调用问题
- invocation 唯一定位,保障回放时精确匹配
- Invocation抽象Identity统一定位由插件自己扩展实现
- 自定义流量采样、过滤、发送、存储
- 基于Tracer实现应用内链路追踪、采样;同时支持多种过滤方式,插件可自由扩展;
数据重放
- 多种入口(HTTP/Dubbo/Java)的回放发起
- 每个类型回放插件实现RepeaterSPI完成回放请求发起,每次回放请求可决定本地回放是否mock,插件也自由实现mock逻辑,mock流程代码
- 自定义回放流量数据来源、回放结果的上报
- 自定义mock/非mock回放、回放策略
- 开放回放流程关键节点hook
回放流量子调用(eg:mybatis/dubbo)不发生真实调用,从录制子调用中根据 MockStrategy 搜索匹配的子调用,利用JVM-Sandbox的流程干预能力,有匹配结果,进行throwReturnImmediately返回,没有匹配结果则抛出异常阻断流程,避免重复调用污染数据
数据对比
diff 去噪声原理
名词解释
- candidate:运行您的新代码的候选实例
- primary: 运行的上一个已知有效代码的主实例
- secondary:运行与主实例相同的已知有效代码的辅助实例
diff 过程
candidate:
{
"userId": 1,
"id": 1,
"title": "delectus aut autem",
"completed": true,
"create_time": "2019/10/28 10:13:56"
}
primary:
{
"userId": 1,
"id": 1,
"title": "delectus aut autem",
"completed": false,
"create_time": "2019/10/28 10:13:50"
}
secondary:
{
"userId": 1,
"id": 1,
"title": "delectus aut autem",
"completed": false,
"create_time": "2019/10/28 10:13:52"
}
create_time是噪声,primary和secondary比较用于去除噪声,primary和candidate在忽略噪声的情况下进行diff