proxy-pool/docs/testing/failure-injection.md
youfak 4de3ffb85f
Some checks are pending
ci / test (ubuntu-latest) (push) Waiting to run
ci / test (windows-latest) (push) Waiting to run
ci / race (push) Waiting to run
feat: add ephemeral proxy activity pool
2026-07-29 12:51:18 +08:00

76 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 故障注入矩阵
## 执行规则
- 先在隔离环境建立 15 分钟稳定基线,再注入单一故障。
- 每次只改变一个变量,记录开始/恢复时间与所有指标。
- PostgreSQL 写故障后核对配置版本、Upstream/Routing 管理状态、Admin 审计和
outboxRedis 写故障后核对活动池、独占提取和短期幂等键,不能只看 HTTP
状态码。
- 故障恢复后至少观察两个健康检查周期和一个 Snapshot 完整发布周期。
## 场景
### Provider
- DNS NXDOMAIN、连接超时、TLS 失败、401、429、500。
- 响应超过 `maxResponseBytes`、模板超过 `templateTimeout`、非法 Proxy。
- 合法空列表、全部重复、部分重复加部分新增。
预期:只有合法空列表增加 Empty429 尊重 Retry-After其余 Error 退避;
duplicate-only 不触发 Sequential 切换。
### PostgreSQL
- 断开 60 秒、连接池耗尽、锁等待、事务提交失败、只读切换。
预期Gateway 继续使用最后 SnapshotRedis 健康时 Fetch、活动池更新和 Extract
不被 PostgreSQL 故障阻断;依赖持久化的配置/Admin 写操作失败关闭。恢复后
outbox 补发且不重复应用PostgreSQL 中没有 Proxy 明细或逐次提取记录需要恢复。
### Redis
- 断开、延迟 2 秒、Leader key 丢失、活动池与幂等键丢失、主从切换。
预期Gateway 在 Snapshot 新鲜度窗口内无影响Distribution 失败关闭并返回 503
不得改写 PostgreSQL 兜底Provider Fetch 不出现多个有效 Leader全局限流明确
降级。恢复后 epoch 单调,由 Provider 重新拉取并构建 TTL 活动池;已经丢失的短期
幂等窗口和旧活动池排他状态不伪装成仍然有效,重建结果视为新的活动池代次。
### Controller
- 杀死 Leader、滚动重启全部副本、阻断 Worker 控制流。
预期:`maxStaleAge` 内 Gateway 继续之后停止新流量Leader 切换不重复计费
FetchDelta 缺口触发完整 Snapshot。
### Gateway
- 杀死一个 Pod、驱逐一个节点、丢失一个可用区、耗尽 FD。
预期LoadBalancer 摘除 NotReady Podownership 租约过期前不分给新 Worker
剩余容量满足已验证故障域目标。
### Checker
- 慢目标、DNS 延迟、队列积压、杀死一半 Pod。
预期:优先新 Proxy 和 SUSPECT稳定 Proxy 降频队列有界Observation 重投
不导致非法状态回退。
### Distribution
- 100 个并发请求争用相同 ProxyRedis 在原子操作执行或主从切换时断开Gateway
同时满载。
预期:同一 Redis 活动池代次内每个 Proxy 最多返回一次;该代次仍保留时,未确认
成功的客户端使用同一幂等键重试并得到已缓存结果或明确失败,不出现部分可见状态;
allOrNothing 整批不变;池中始终剩余 `reserveForGateway`;没有 Release 恢复路径。
### 配置与 Secret
- 未知字段、错误正则、缺失 Upstream、公开监听无保护、凭据轮换失败。
预期:新 Revision 整体拒绝,旧不可变 Snapshot 继续;认证错误计 Error 而不是
Empty日志不出现 Secret。