POST /reconcile 是后端同步长任务:后端持集群级单飞锁 lock:reconcile(初租 300 s, 期间每 30 s 心跳续租至 90 s,notify.rs:159/172),但网关原先只有全局超时 10 s、 最多 2 次尝试。一次完整对账很容易撑过网关窗口被误判失败,随后故障转移到第二实例, 而第二实例必然立刻返回 409;客户端既拿不到 204 也拿不到 409,只能看到 "all backends failed"。 改动: - handleFetch 为 /reconcile 单独覆盖超时与尝试次数:超时取 LB_RECONCILE_TIMEOUT_MS (默认 320000 ms,大于锁初租 300 s + 心跳余量),maxAttempts=1 绝不故障转移 (切实例只会撞锁,没有任何收益) - 其余快路径完全不受影响,仍用全局 LB_REQUEST_TIMEOUT_MS / LB_MAX_ATTEMPTS - 新增测试:记录 setTimeout 收到的延迟来断言 /reconcile 走 320000 ms,并用 503 响应 断言它只尝试 1 个 origin;同时断言 /webhook/tg 仍用 5000 ms 且仍故障转移到第二 实例;并断言 env 覆盖生效而 maxAttempts 恒为 1 - worker README 补 LB_RECONCILE_TIMEOUT_MS 说明与 /reconcile 例外 - deployment.md §6.3.1 删掉「请把 LB_REQUEST_TIMEOUT_MS 调到大于锁租期」的旧 workaround 建议(现已由 per-route 覆盖解决),§10 worker 故障转移条目补例外,secret 清单补新变量 - 顺手清掉 health.js 注释里已退役的 GATE-READY-DEPS,改为 ARCH-READY-BASELINE 验证:cloudflare-worker node --test 29/29 通过(原 28 + 新增 1); web config.test.mjs 6/6 通过。无 src/ 改动,Rust 门禁不受影响。 |
||
|---|---|---|
| .. | ||
| backends.js | ||
| health.js | ||
| index.js | ||
| lb.js | ||