Skip to content

bug: Grok Console 配额同步失败后缓存永不过期,导致 resource_exhausted 429 换号也全失败 #985

Description

@minxiang0101

问题描述

当 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

复现步骤

  1. 账号池运行一段时间后,部分账号 quotaWindows.syncedAt 停在旧时间(实测停 24h+)
  2. 请求这些账号 → 上游返回 429 upstream_rate_limited_resource_exhausted
  3. 手动调用 POST /api/admin/v1/accounts/{id}/refresh-quota同一账号立刻恢复可用(实测 200,remaining=9/10 仍有配额)
  4. 说明:账号本身没问题,是本地缓存过期

根因分析

  1. 配额同步失败无自愈:日志显示 account_initial_identity_sync_failed: Grok Session 接口返回 429——同步任务被上游 429 卡死后,没有重试/告警/降级,quotaWindows 缓存永久停留在旧值
  2. 收到 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)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions