复制请求,不复制副作用
代理可以把一定比例的请求镜像到影子服务,用户仍收到原始响应。影子服务在安全数据存储上处理请求,返回会被记录并丢弃的响应,且不得写生产表、发消息或调用外部供应商。
route:
- match: { prefix: /api/orders }
route:
- destination: { host: orders-v1 }
mirror:
host: orders-v2
mirrorPercentage: 10
示例是 Istio 风格路由。关键是有限的镜像比例和独立资源的目的地。
隔离写入与数据
镜像读端点很简单,写端点则不然。使用沙箱数据库、dry-run 模式,或无法产生外部效果的独立账号。如果影子服务调用支付供应商,应指向测试供应商或阻断调用。影子日志中的个人数据要脱敏或哈希,并施加与生产相同的访问控制。
在真实负载下比较
记录影子响应、状态码和延迟,再与原始结果比较。返回 200 但耗时三倍的影子服务尚未就绪。监控影子服务的 CPU、依赖使用和错误率。若它拖慢主路径或耗尽共享依赖,立即停止镜像。
何时使用
当合成测试无法复现真实请求组合,而新实现需要在暴露前获得生产证据时,使用影子流量。优点是零用户影响下的真实校验;代价是重复负载、副作用风险和数据隐私工作。与金丝雀相比,影子完全隐藏新响应;与暗发布相比,它专门镜像实时流量。