广告请求流量回复Diff对比技术方案

一、需求背景

1.1 背景概述

我们重构了广告引擎,采用新的竞价排名机制。

为了验证其业务影响,我们计划通过线上日志记录和回放工具来重现流量,并与当前线上版本进行比较。

1.2 业务需求

验证新旧广告引擎指定日期流量投放效果的数据表现差异。

二、术语与约定

2.1 名词解释

  1. 广告引擎:负责广告排序和展示的系统;
  2. 日志记录:记录广告引擎上游RPC请求日志(其中日志信息已包含标签、设备等信息);
  3. 回放工具:可以解析日志并重现流量到指定系统的测试工具;
  4. 数据仿真:
  5. 同步线上广告引擎所需数据表建立新库;
  6. 不建立新库,使用原有测试环境库,同步campaign与slice;
  7. 环境隔离:将测试环境与流量环境进行隔离;(计费服务、事件KafkaTopic隔离)
  8. 模拟策略配置:分层策略模拟配置;

2.2 基本约定

  • 使用SLS日志服务记录日志;
  • 使用Kafka作为日志传输和回放的中间件;
  • 通过回复工具进行1.0配速接口请求流量回放
  • 通过回放结果数据对比广告数据表现,最终得到 -DIFF方式比较测试结果;

三、整体架构

image-20231129103324841

四、详细设计

4.1 总体回放流程

image-20231129100514042

4.2 关键场景处理

1.记录日志:记录广告引擎前置RPC请求日志,打印至SLS;

2.数据清洗:根据广告事件与日志关联,得到对应是否触发曝光与点击

3.回放工具:

​ 2.1 解析和回放日志:回放工具从SLS拉取日志;

​ 2.2 保存真实流量日志发到Kafka,记录对应的分区;

​ 2.3 待回放环境准备好后可以进行流量回复,会加快可增加倍速;

​ 2.4 特殊逻辑处理,回访时,根据SLS日志:需要触发曝光和点击行为;

3.回放环境准备

​ 3.1 广告引擎依赖库表以及创建独立环境,并同步生产的数据;

​ 3.2 广告计费服务创建独立环境与库表,并创建单独KafkaTopic;

4.广告数据报表

比较测试:获取原有广告引擎和新引擎的测试数据,采用DIFF方式比较检验效果。

五、常用工具对比

目前开源的流量回放工具比较多,如何选择适合自己业务的工具呢?

根据录制方式的不同,将流量回放工具大致分为以下三类:即基于应用进程录制、基于中间件录制和基于网络协议栈的录制,并单独介绍各工具的特点及适用范围 img

1、基于应用进程

①.Sharingan

介绍:Sharingan 是一个基于 golang 的流量录制回放工具,可以录制线上真实请求流量进行回放测试

原理:修改 golang 源码,在 Socket Connect、Accept、Send、Receive、Close 等阶段加钩子拦截并镜像流量

优点: • 功能齐全,支持流量筛选/比例控制 • 支持 http、mysql、redis、thrift 等协议 • 流量回放自带 diff/mock 功能

不足: • 需要根据 golang 定制版重新编译程序 • 只适合 go 语言开发的应用

2、基于中间件

①.ngx_http_mirror_module

介绍: nginx 1.13.4 及后续版本内置 ngx_http_mirror_module 模块,提供流量镜像 (复制) 的功能

原理:在 nginx 内部接收到流量时,复制相同的流量至 mirror 环境

优点: • 支持流量放大,配置简单,可转发至多份镜像 • 无需录制流量,实时转发 • 源站请求,直接原路返回; mirror 请求的返回不作处理

不足: •流量较大时严重影响线上 Nginx 性能 •只支持 HTTP 协议

②.JVM-SANDBOX-Repeater 介绍:JVM-SANDBOX-Repeater 是 JVM-Sandbox 生态体系下的重要模块,它具备了 JVM-Sandbox 的所有特点,插件式设计便于快速适配各种中间件,封装请求录制/回放基础协议,也提供了通用可扩展的各种丰富 API

原理:基于 JVM 的非侵入式运行期 AOP 解决方案

优点: • 流量回放只是基本功能,可以扩展到沙箱的其他能力 • 通用的录制/回放能力,多协议的支持 • 可追踪内部调用链,方便 debug

不足: • 只适用于 JAVA 类应用 • 有一定上手难度,熟悉 JAVA/JVM • 对于线上 JVM 仍然会有性能影响

3、基于网络协议栈

①.Goreplay

介绍:GoReplay 是一个用 golang 编写的开源工具,用于捕获实时 HTTP 流量并将其回放到测试环境中

原理:利用 gopacket 库,基于 libpacp 抓包,并利用 go 的协程特性,实现回放速率的控制

优点: • 安装部署简单,对业务应用无侵入,只占用机器带宽 • 支持过滤和修改流量,可实时转发流量 • 支持回放速率控制,可用于性能测试

不足: • 目前只支持 HTTP1.1 及以下协议 • 无法解析二进制的数据交互协议,如 Protobuf

②.TcpCopy

介绍:TCPCopy 是一个开源的流量回放工具,支持多种类型流量的实时及离线回放

原理:复制在线的 TCP 类型的请求数据包,修改 TCP/IP 头部信息,发送给测试服务器,达到欺骗测试服务器的 TCP 程序的目的

优点: • 业务无侵入,因为 intercept 的存在,实时导流对线上影响较小 • 基本 tcp 协议栈的协议都可以支持,几乎是目前支持协议最多的流量回放工具 • 基于 ip 层发送,流量更加真实 • 支持分布式架构,可以当作压测工具使用

不足: • 部署难度大,需要同时部署 tcpcopy 和 intercept,参数较复杂 • 录制和回放都是基于底层数据包,难以进行流量的筛选和定制

4.收钱吧自研日志回访工具

img

六、常见问题

Q:回放流量的结果能代表真实情况吗?

A:通过记录实际生产流量,保证场景覆盖面,可以基本代表真实情况。

Q:如何保证测试环境数据和线上的一致性?

A:同步线上数据到测试数据库

Q:接口有外部依赖,无法保证外部接口/服务返回的一致性?

A:需要调用外部接口/服务时,采用 mock 的方法等外部依赖进行隔离

0%