feat(retry): 重试间隔与传输错误粘滞同号重试#334
Conversation
新增两个系统设置(默认值保持旧行为,老部署无感): retry_interval_ms(0-30000,默认 0 = 立即重试): - 两次重试之间等待配置的间隔,等待期间客户端断开立即中止 - 覆盖:传输错误重试、上游非 200 状态重试、首包前断流透明重试、 WS 静默重试(Responses 主循环 / OpenAI 直连 / ChatCompletions / compact 两分支 / 入站 WS) - 首字超时重试不叠加间隔(已白等一轮) transport_retry_policy(rotate 默认 / sticky): - 网络波动、代理换节点等连接级失败(classifyTransportFailure 命中) 的根源不在账号:sticky 模式下不换号、不记账号失败(避免误伤健康度)、 不解绑会话亲和、不硬排除,等间隔后同号重试 - 上游 HTTP 状态错误(5xx/401/429)与流断仍按旧逻辑换号, 因为这些是上游针对账号返回的,粘滞意义存疑 链路:system_settings 两列(pg/sqlite 迁移)→ admin settings API → store atomics → proxy 读取;前端设置页在最大重试次数旁新增两个控件。 测试:waitBeforeRetry 间隔/取消行为、设置归一化、 入站 WS 端到端 sticky 同号 / rotate 换号各一条。
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (11)
📝 WalkthroughWalkthroughAdds configurable retry interval ( ChangesConfigurable retry interval and sticky transport retry
Estimated code review effort: 4 (Complex) | ~60 minutes Sequence Diagram(s)sequenceDiagram
participant Client
participant Handler
participant Store
participant Upstream
Client->>Handler: request (/v1/responses)
Handler->>Upstream: forward request
Upstream-->>Handler: transport error
Handler->>Handler: compute stickyRetry
alt stickyRetry
Handler->>Handler: skip ReportRequestFailure, keep session affinity
else not sticky
Handler->>Handler: ReportRequestFailure, UnbindSessionAffinity
end
Handler->>Store: GetRetryIntervalMS
Handler->>Handler: waitBeforeRetry
alt client context canceled
Handler-->>Client: return early
else
Handler->>Upstream: retry request
Upstream-->>Handler: success
Handler-->>Client: response
end
Possibly related PRs
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
说明
实现 #331 的两个诉求。新增两个系统设置,默认值完全保持旧行为(间隔 0、策略 rotate),老部署无感。
Closes #331
retry_interval_ms — 重试间隔(0~30000ms,默认 0)
两次重试之间等待配置的间隔,等待期间客户端断开立即中止(
waitBeforeRetry用select ctx.Done()实现,sleep 前已释放账号并发槽)。覆盖的重试点:传输错误、上游非 200 状态、首包前断流透明重试、WS 静默重试(Responses 主循环 / OpenAI 直连分支 / ChatCompletions / compact 两分支 / 入站 WS)。首字超时重试不叠加间隔——那条路径已经白等了一轮超时。
transport_retry_policy — 传输错误重试策略(rotate 默认 / sticky)
issue 里的两个场景(梯子换节点、网络断几秒)都是连接级传输错误,故障根源不在账号。sticky 模式下:
MarkHard、不解绑会话亲和,下一轮自然拿回同一账号;ReportRequestFailure,网络问题不再污染账号健康度;范围刻意收窄到传输错误:5xx/401/429 是上游针对账号返回的,粘滞重试大概率复现同样错误,仍按旧逻辑换号。这也是没有完全按 issue 中"非 401/429 都粘滞"实现的原因,如有需要可后续加一档 scope 设置。
链路
system_settings两列(pgADD COLUMN IF NOT EXISTS/ sqlite 列迁移)→ admin settings API(0-30000 clamp / 枚举归一)→ store atomics → proxy 读取;前端设置页在"最大重试次数"旁新增数字输入与策略下拉(中英文案)。测试
waitBeforeRetry:间隔 0 快路径 / ctx 已取消 / 按间隔等待 / 等待中取消即时中止go build ./...、go test ./...、前端tsc --noEmit+vite build全部通过Summary by CodeRabbit
New Features
Bug Fixes
Tests