流量重放

流量录制

数据采集

  1. 业务代码
  2. rpc 框架
  3. 字节码增强
  4. 语言标准库
  5. 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 去噪声原理

img.png

名词解释

  • 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

results matching ""

    No results matching ""