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

3.1 KiB
Raw Permalink Blame History

故障注入矩阵

执行规则

  • 先在隔离环境建立 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。