
ShadowDiff:为 AI 迁移后端提供影子测试与 SQL 差异比对
来源标题:Show HN: ShadowDiff – Shadow testing and SQL diffing for AI-migrated back ends
ShadowDiff 推出一款双流量影子测试引擎,用于企业用 AI 将 Java 7/8、Python 2、PHP 5.6 等遗留后端迁移到 Go、Node、FastAPI 等现代栈时降低上线风险。它作为网络代理,把真实 HTTP 流量同时复制到旧服务与 AI 重构服务,对比两者行为;开发者称 AI 生成的代码约 95% 准确,剩余 5% 隐藏边界情况是部署的主要顾虑。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
面向 AI 重构遗留代码的双流量影子测试引擎 消除那 5% 的风险,正是它让企业 CTO 不敢把 AI 现代化改造后的后端部署到生产环境。 🌐 交互式在线云端沙箱:https://shadowdiff-demo.fly.dev(自驱动双流量模拟器已启用) 企业正在积极地把关键业务遗留后端(Java 7/8 的 Spring 单体、Python 2 的 Django、PHP 5.6 后端)借助 AI 代码迁移引擎,现代化改造为云原生服务(Go、TypeScript/Node、FastAPI)。 虽然 AI 能准确生成约 95% 的重构代码,但剩下 5% 的隐藏边界情况,会让生产部署变成一场不可接受的风险: ShadowDiff 是一个高性能网络代理与分析引擎,它会复制真实的预发或生产 HTTP 流量,将完全相同的请求负载同时发送给遗留服务和 AI 重构后的服务。 [ 实时入站流量 ] │ ▼ ┌─────────────────────────────┐ │ Envoy Gateway / Mesh │ │ (request_mirror_policies) │ └──────────────┬──────────────┘ │ ┌───────────────────┴───────────────────┐ ▼ ▼ ┌───────────────────┐ ┌───────────────────┐ │ Legacy Service │ │ ShadowDiff Core │ │ (Target) │ │ (Analysis Engine)│ └─────────┬─────────┘ └─────────┬─────────┘ │ │ │ (Live Response to Client) ▼ │ ┌───────────────────┐ │ │ AI-Refactored │ │ │ Candidate (S) │ │ └─────────┬─────────┘ │ │ └───────────────────┬───────────────────┘ ▼ ┌─────────────────────────────┐ │ 3-Way Diff & SQL Comparator │ │ - P1 ⊕ P2 Noise Filter │ │ - SQL Mutation Interceptor │ │ - N+1 Query Loop Detector │ └──────────────┬──────────────┘ │ (Pure Regressions Isolated) ▼ ┌─────────────────────────────┐ │ Automated AI Test Generator │ │ - Powered by Google Gemini │ │ - Synthesizes Go/Jest Tests │ │ - Root Cause Code Fixes │ └─────────────────────────────┘ 🚀 核心架构能力
- ⚡ 网络层 Envoy 流量镜像 ShadowDiff 通过 request_mirror_policies 直接与 Envoy Proxy 和 Istio Service Mesh 集成。流量在网络层以线速异步克隆,对应用延迟零开销。 通过评估两个基线实例,自动过滤掉非确定性的运行时噪声(时间戳、UUID、会话 nonce): $$\mathcal{N} = P_1 \oplus P_2$$ $$\mathcal{D} = (P_1 \oplus S) \setminus \mathcal{N}$$ 只有经过验证的契约回归才会进入开发者的人工排查环节。 捕获并关联两个服务针对每条 HTTP trace 所执行的 SQL 语句: 每一个被隔离出来的边界情况都会由 Google Gemini(gemini-2.0-flash)分析,它会编写一个开箱即用的集成测试(Go httptest 或 Vitest)并诊断出代码修复方案。 通过与 GitHub API 直接集成,免去人工排查: 一个原生部署阻断器,在预发布 soak 测试或集成流水线中评估流量质量:
在 CI/CD 流水线中评估质量门禁:
shadowdiff gate
-dashboard-url=http://localhost:8083
-duration=15s
-min-parity=100.0
-min-requests=50
-max-drifts=0
-allow-n-plus-one=false
-allow-db-drift=false
7. 🛡️ 临时写时复制(CoW)数据库沙箱
可对会产生变更的 HTTP 方法(POST、PUT、DELETE、PATCH)进行安全的影子镜像,而不会污染数据库:
把 ShadowDiff 直接纳入你的自动化部署流水线(.github/workflows/shadowdiff.yml):
name: Dual-Traffic Shadow Gating
on: [pull_request, push]
jobs:
shadow-gate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5 with: go-version: '1.22'
- name: Build & Start Services run: | go build -o bin/shadowdiff ./cmd/shadowdiff/main.go ./bin/legacy-service -port=:8081 & ./bin/refactored-service -port=:8082 & ./bin/shadowdiff -proxy-port=:8080 -primary-url=http://localhost:8081 -shadow-url=http://localhost:8082 -sandbox-mode=rollback & sleep 2
- name: Replay Traffic run: | for i in {1..25}; do curl -s "http://localhost:8080/api/users?id=$i" > /dev/null curl -s -X POST "http://localhost:8080/api/orders" -d '{"amount":99.50}' > /dev/null done
- name: Run ShadowDiff Quality Gate
run: |
./bin/shadowdiff gate
-dashboard-url=http://localhost:8083
-min-parity=100.0
-min-requests=20
-allow-n-plus-one=false
-allow-db-drift=false 🛠️ 基于 Envoy 与 Docker Compose 的快速上手 启动完整的 5 容器 service mesh 测试环境(Envoy Gateway + ShadowDiff + Legacy Target + Twin Replica + AI Candidate):
1. 克隆仓库
git clone https://github.com/vishalrajofficial/ShadowDiff.git cd ShadowDiff
2. 启动 Envoy Service Mesh 拓扑
docker compose -f docker-compose.envoy.yml up -d 通过 Envoy 发送入站流量(端口 10000):
向 Envoy Gateway 发送测试流量(会自动镜像到 ShadowDiff):
curl http://localhost:10000/api/users/1 curl -X POST http://localhost:10000/api/orders 打开 http://localhost:8083 的遥测仪表盘,查看实时的三路 diff、SQL 变更时间线和 Gemini 生成的测试! 对于运行 Istio 或原生 Envoy 的生产 Kubernetes 集群,部署随附的 EnvoyFilter 即可动态镜像流量: kubectl apply -f deploy/k8s/envoy-shadow-sidecar.yaml 完整的架构说明请见 docs/ARCHITECTURE.md。 本项目基于 MIT License 授权。
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。