4. Shadow部署架构设计

Shadow部署的核心目标,是让新模型在不影响生产交易的前提下,接收与生产环境同源的真实请求,完成推理并输出结果,但不将结果返回给业务方。因此,架构设计的关键不是“让模型跑起来”,而是构建一条可复制、可隔离、可观测、可回滚的旁路链路。本节围绕数据流、请求复制、旁路评估、日志采集与监控体系五个部分展开。

一、核心原理:Shadow链路与生产链路的关系

生产链路是“请求→网关→生产模型→响应→业务”。Shadow链路则是在网关或服务网格层将请求复制一份,异步发送到Shadow服务,Shadow服务调用新模型完成推理,结果写入日志与评估库,不参与真实响应。两条链路共享输入,但输出完全隔离。

这种设计带来三个约束:第一,Shadow链路必须异步非阻塞,不能拖慢生产请求;第二,Shadow服务需要独立资源池,避免与生产模型争抢GPU或内存;第三,所有Shadow请求必须可标识、可采样、可关闭,便于灰度与熔断。

业务请求 API网关 / Mesh 请求复制 + 采样 生产模型服务 返回真实响应 业务响应 Shadow服务 异步推理 新模型实例 独立资源池 日志与评估库 对比指标 监控体系:延迟 / 错误率 / 资源 / 一致性 Prometheus + Grafana + 告警 复制请求 指标上报

二、请求复制:在哪里复制、复制什么、复制多少

请求复制通常有三个位置:网关层、服务网格Sidecar、应用内埋点。网关层复制最通用,适合HTTP/RPC接口;Sidecar复制对业务代码零侵入,但需要服务网格支持;应用内埋点最灵活,可精确控制字段,但改造成本高。

复制内容需要遵循“最小必要”原则:请求ID、用户标识、输入特征、时间戳、渠道来源必须保留;敏感字段如身份证、银行卡号需脱敏或哈希。复制比例建议从1%开始,逐步提升到10%、50%,最终全量。复制策略可用如下配置表达:

shadow:
  enabled: true
  sample_rate: 0.05          # 5%采样
  async: true                # 异步非阻塞
  timeout_ms: 800            # Shadow超时,不影响生产
  max_concurrency: 200       # 最大并发,防止打爆
  exclude_paths:
    - /health
    - /metrics
  mask_fields:
    - id_card
    - bank_card
    - phone
建议为Shadow请求打上独立Header,例如 X-Shadow: true 与 X-Shadow-Trace-Id,便于全链路追踪与日志过滤。

三、旁路评估:如何判断新模型是否更优

Shadow部署的价值在于“用真实流量做离线评估”。评估体系需要同时关注效果指标与工程指标。效果指标包括准确率、AUC、KS、召回率、排序一致性;工程指标包括P99延迟、错误率、GPU利用率、显存占用。两者必须同时达标,才能进入下一阶段。

评估维度 核心指标 采集方式 达标阈值示例
效果一致性 与生产模型输出一致率 Shadow日志对比 ≥ 92%
排序能力 AUC / KS 离线评估任务 AUC提升 ≥ 0.5%
延迟 P99推理耗时 Prometheus Histogram ≤ 生产模型1.5倍
稳定性 错误率 / 超时率 日志与监控 ≤ 0.1%
资源 GPU利用率 / 显存 DCGM / Node Exporter ≤ 80%

四、日志采集与监控体系搭建

Shadow日志必须包含请求侧与响应侧两部分,并通过Trace ID关联。推荐结构如下:

{
  "trace_id": "a1b2c3d4",
  "request_id": "req_889900",
  "model_version": "v2.3.1",
  "input_hash": "f3a9...",
  "prod_output": {"score": 0.82, "rank": 3},
  "shadow_output": {"score": 0.85, "rank": 2},
  "latency_ms": 46,
  "status": "success",
  "timestamp": "2025-04-12T10:23:45Z"
}

日志采集链路建议采用“应用→Kafka→Flink→数据湖/评估库”的异步管道,避免直接写数据库造成瓶颈。监控体系则分为三层:基础设施层(CPU/GPU/内存)、服务层(QPS/延迟/错误率)、业务层(一致率/漂移/覆盖率)。告警规则应设置“Shadow链路异常不影响生产”的隔离策略。

常见误区:将Shadow日志与生产日志混写同一张表,导致查询缓慢且难以清理;或未设置采样上限,Shadow流量突增拖垮新模型实例。务必为Shadow链路设置独立Topic、独立存储与独立告警通道。

五、复盘:一个典型的Shadow部署失败案例

某团队在网关层开启100%请求复制,但未设置异步与超时,导致生产请求P99从80ms升至420ms。复盘发现三个问题:第一,复制逻辑同步等待Shadow响应;第二,Shadow服务与生产模型共享GPU,资源争抢;第三,日志直接写MySQL,写入放大。修正方案是:改为Kafka异步复制、Shadow独立GPU节点、日志写入ClickHouse,并将采样率降至5%。修正后生产P99恢复至85ms,Shadow评估正常进行。

因此,Shadow部署架构设计的本质是隔离与可观测:隔离资源、隔离链路、隔离故障;可观测请求、可观测输出、可观测指标。只有把数据流、请求复制、旁路评估、日志采集与监控体系五部分串成闭环,Shadow部署才能真正成为模型上线的安全试验场。