问题描述
当 Grok Console 账号的配额同步(quota sync)因上游 429 失败后,本地配额缓存永远停留在旧值,选号器持续基于过期数据选号,导致请求全部返回 upstream_rate_limited_resource_exhausted,即使换号重试也全部失败。
复现环境
- grok2api v3.1.4(Docker 单容器)
- ~2200 个 Grok Console 账号(SSO 批量导入)
- 24h 内 37 次 429,全部
upstream_rate_limited_resource_exhausted
复现步骤
- 账号池运行一段时间后,部分账号 quotaWindows.syncedAt 停在旧时间(实测停 24h+)
- 请求这些账号 → 上游返回 429
upstream_rate_limited_resource_exhausted
- 手动调用
POST /api/admin/v1/accounts/{id}/refresh-quota → 同一账号立刻恢复可用(实测 200,remaining=9/10 仍有配额)
- 说明:账号本身没问题,是本地缓存过期
根因分析
- 配额同步失败无自愈:日志显示
account_initial_identity_sync_failed: Grok Session 接口返回 429——同步任务被上游 429 卡死后,没有重试/告警/降级,quotaWindows 缓存永久停留在旧值
- 收到 resource_exhausted 不触发即时刷新:请求返回 429 后,路由只是"跳过该账号换下一个",没有把 429 当作"配额信息过期需刷新"的信号。换号后命中的依然是过期缓存 → 全池 429
建议修复
- 收到上游
resource_exhausted 429 时,先触发该账号的 refresh-quota 再决定是否重试
- 配额同步失败时增加重试与告警(或标记缓存为 stale,选号时优先跳过)
- 可考虑对
refresh-quota 做全池定时强制刷新兜底
日志证据
account_initial_identity_sync_failed account_id=6157 error="Grok Session 接口返回 429"
# 手动 refresh-quota 后:
acct 3541: remaining=9/10 syncedAt=2026-08-20T04:34:42 source=upstream ← 刷新成功
# 同账号请求立刻 200
环境
- 版本:v3.1.4
- 部署:Docker 单容器(非 compose/quality-guard)
- 上游:Grok Console(SSO)
问题描述
当 Grok Console 账号的配额同步(quota sync)因上游 429 失败后,本地配额缓存永远停留在旧值,选号器持续基于过期数据选号,导致请求全部返回
upstream_rate_limited_resource_exhausted,即使换号重试也全部失败。复现环境
upstream_rate_limited_resource_exhausted复现步骤
upstream_rate_limited_resource_exhaustedPOST /api/admin/v1/accounts/{id}/refresh-quota→ 同一账号立刻恢复可用(实测 200,remaining=9/10 仍有配额)根因分析
account_initial_identity_sync_failed: Grok Session 接口返回 429——同步任务被上游 429 卡死后,没有重试/告警/降级,quotaWindows 缓存永久停留在旧值建议修复
resource_exhausted429 时,先触发该账号的refresh-quota再决定是否重试refresh-quota做全池定时强制刷新兜底日志证据
环境