4. 回放数据源:采集方式与数据格式标准化

回放数据源是策略回放对比的“原材料”。数据采集的完整性、准确性以及格式的统一性,直接决定了回放结论的可信度。本章详细拆解三种主流采集方式及其数据格式标准化方案。

4.1 数据采集方式对比

根据业务场景与成本要求,风控网关通常采用以下三种方式采集回放数据:

采集方式 数据完整性 存储成本 回放延迟 典型场景
全量日志 100% 请求记录 高(TB级/日) 分钟级(实时管道) 核心策略灰度验证、监管审计
抽样日志 按比例(1%~10%) 低 准实时 日常监控、快速迭代验证
离线Hive表 全量(T+1) 中(压缩后) 天级 历史回溯、长周期趋势分析
选型建议: 生产环境建议以“全量日志”为主管道,辅以“抽样日志”做快速验证;离线Hive表适用于月度/季度级的大规模策略调优,避免对在线存储造成压力。

4.2 全量日志采集链路

全量日志采集通常采用“网关埋点 → 消息队列 → 实时ETL → 存储”的架构,确保每条请求不丢失、不重复。

全量日志采集链路架构 风控网关 消息队列(Kafka) 实时ETL 存储层 关键说明: • 网关埋点:在请求入口处异步写入日志,不阻塞主流程。 • 消息队列:利用Kafka高吞吐特性,削峰填谷,保证数据不丢失。 • 实时ETL:完成字段清洗、格式转换、敏感信息脱敏。 • 存储层:写入HDFS/ClickHouse/ES,供回放引擎按需拉取。

4.3 抽样日志策略

抽样日志适用于流量峰值时段或非核心策略的快速验证。常见的抽样策略包括:

  • 固定比例抽样: 按请求ID哈希取模,如取1%流量(hash(requestId) % 100 == 0)。
  • 分层抽样: 按用户等级、渠道、风险等级分层,保证各层均有代表性样本。
  • 自适应抽样: 根据当前QPS动态调整抽样率,高负载时降低比例,低负载时提高比例。
注意: 抽样日志不适用于“零误杀”类策略验证。若策略仅影响千分之一流量,1%抽样可能完全漏掉异常样本,导致回放结论失真。

4.4 离线Hive表采集

离线Hive表通常作为“冷数据”存储,用于长周期(月度/季度)的策略回放对比。其采集流程如下:

  1. 数据导出: 从在线存储(Kafka/ES)按天导出原始日志到Hive分区表。
  2. 数据清洗: 剔除无效请求、补全缺失字段、统一时间戳格式。
  3. 分区存储: 按日期/小时分区,便于回放引擎按时间范围快速扫描。
  4. 压缩归档: 使用Snappy或Zstd压缩,降低存储成本。

4.5 数据格式标准化:JSON vs Protobuf

无论采用哪种采集方式,回放数据必须统一为标准化格式。当前业界主流方案为JSON和Protobuf,其对比见下表:

对比维度 JSON Protobuf
可读性 高(纯文本,可直接查看) 低(二进制,需工具反序列化)
序列化大小 较大(含冗余字段名) 小(压缩后约为JSON的30%~50%)
解析性能 中等(需字符串解析) 高(二进制解析,CPU开销低)
Schema演进 灵活(新增字段不影响旧数据) 需预定义.proto文件,兼容性需设计
生态工具 丰富(几乎所有语言原生支持) 需额外安装protoc编译器

4.6 标准化回放数据模型

无论底层采用JSON还是Protobuf,回放数据模型应包含以下核心字段:

{
  "requestId": "req_20250321143000_abc123",   // 全局唯一请求ID
  "timestamp": 1742545800000,                  // 请求到达时间(毫秒时间戳)
  "userId": "u_98765",                         // 用户标识
  "riskLevel": "high",                         // 原始风险等级
  "features": {                                // 特征字典
    "deviceScore": 0.85,
    "ipReputation": "bad",
    "orderAmount": 2999.00
  },
  "strategyResult": {                          // 原始策略执行结果
    "strategyId": "s_1001",
    "action": "block",
    "reasonCode": "R001"
  },
  "extInfo": {}                                // 扩展字段,用于未来兼容
}
标准化原则: 所有回放数据必须包含 requestId(去重)、timestamp(时序对齐)、features(特征快照)、strategyResult(原始决策)。缺失任一字段,回放引擎应主动拒绝加载并告警。

4.7 数据格式转换与兼容

在实际生产环境中,全量日志可能以Protobuf格式存储(节省带宽),而离线Hive表可能以JSON格式导出(便于分析)。回放引擎需内置格式转换层:

回放引擎数据格式转换层 Protobuf日志 JSON日志 格式转换引擎 Schema映射 + 校验 统一回放模型 内部Protobuf 转换引擎自动识别输入格式,执行字段映射、类型校验、缺失值填充,最终输出统一的内部Protobuf模型供回放引擎使用。

4.8 数据质量校验要点

在回放开始前,必须对数据源进行质量校验,避免“脏数据”污染回放结论:

  • 完整性校验: 检查requestId是否唯一,timestamp是否在预期时间窗口内。
  • 格式校验: 验证JSON结构是否合法,Protobuf反序列化是否成功。
  • 字段一致性: 确保features字典中的key与策略模型输入特征一致。
  • 时间对齐: 检查数据时间戳是否与回放窗口匹配,避免跨天数据错位。
最佳实践: 建议在回放数据采集阶段就完成格式标准化,避免在回放引擎中做实时转换。全量日志直接以Protobuf写入Kafka,离线Hive表导出时自动转换为JSON+压缩,减少回放引擎的转换开销。