Skip to content

精准收紧 accounts.extra 观测字段触发的调度重建#938

Open
xvhuan wants to merge 3 commits intoWei-Shaw:mainfrom
xvhuan:fix/account-extra-scheduler-pressure-20260311
Open

精准收紧 accounts.extra 观测字段触发的调度重建#938
xvhuan wants to merge 3 commits intoWei-Shaw:mainfrom
xvhuan:fix/account-extra-scheduler-pressure-20260311

Conversation

@xvhuan
Copy link
Contributor

@xvhuan xvhuan commented Mar 11, 2026

背景

线上排查里,accounts.extra 的更新仍然会把很多“只用于展示/观测”的字段也升级成 scheduler_outbox.account_changed,从而带出一整条额外链路:

  • scheduler_outbox
  • outbox worker 回读账号
  • 更新单账号缓存
  • 按 group/platform 重建 bucket

这在 codex_* 快照和 session_window_utilization 这种高频观测字段上放大得尤其明显。

这次 PR 的目标不是泛化优化,而是先把已经确认不影响调度分桶的那一小组 extra 字段单独收紧,避免继续放大 outbox 和 bucket rebuild。

改动内容

1. UpdateExtra 改为按 key 分类

在 repository 层给 UpdateExtra(...) 增加键级别判断:

  • 以下观测型字段不再触发 account_changed
    • codex_primary_*
    • codex_secondary_*
    • codex_5h_*
    • codex_7d_*
    • codex_usage_updated_at
    • session_window_utilization
  • 其他字段保持原行为,不在白名单里的键一律继续 enqueue account_changed

也就是说,这次是保守白名单,不是黑名单放行。

2. 观测字段仍尽量补单账号缓存

对于被判定为 scheduler-neutral 的 extra 更新:

  • 不再写 scheduler_outbox
  • 但如果单账号缓存已经存在,会直接 patch 对应账号的 Extra

这样可以避免 bucket rebuild,同时尽量不让 GetAccount(...) 命中的缓存落后太多。

为什么这样做

  • mixed_schedulingmodel_rate_limits 这类真正影响调度或账号选择的字段,这次完全不碰。
  • 观测字段走 repository 白名单收紧,比在多个 service 调用点分散判断更稳,也更不容易漏。
  • 这次没有去做“值未变化时跳过写入”的更激进优化,是为了先控制回归面。

风险控制

  • 不改数据库 schema。
  • 不改接口协议。
  • 不改调度 SQL 条件。
  • 不改 scheduler_outbox 消费逻辑。
  • 只有明确在白名单里的观测字段才跳过 outbox,其他字段全部保持旧行为。

测试

静态与 unit

  • docker run --rm -v /home/ius/sub2api/backend:/src -w /src golangci/golangci-lint:v2.9.0 golangci-lint run --timeout=30m
  • docker run --rm -v /home/ius/sub2api/backend:/src -w /src golang:1.26.1 /usr/local/go/bin/go test -tags=unit ./...

repository integration

  • docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /home/ius/sub2api/backend:/src -w /src golang:1.26.1 /usr/local/go/bin/go test -tags=integration ./internal/repository -count=1

新增覆盖:

  • UpdateExtra 更新 codex_* / session_window_utilization 时不写 outbox
  • scheduler-neutral 更新会 patch 已存在的单账号缓存
  • mixed_scheduling 这类调度相关键仍然会写 outbox

本地 Docker 回归

  • docker compose -f /tmp/sub2api-prtest-compose.yml up -d --build
  • GET /health 返回 200
  • GET /api/v1/settings/public 返回 200
  • POST /api/v1/auth/login 返回 200
  • GET /api/v1/admin/dashboard/snapshot-v2 返回 200
  • GET /api/v1/admin/dashboard/users-trend 返回 200

本地小并发

  • settings/public 并发 30 请求:全部 200
  • snapshot-v2 并发 20 请求:全部 200

fork CI

  • CI:通过
  • Security Scan:通过

@Wei-Shaw
Copy link
Owner

@xvhuan 冲突需要处理一下。

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants