feat: 实现三维限流与生成队列延后 #44

Closed
opened 2026-08-24 12:01:53 +08:00 by ila · 2 comments
Owner

基本信息

  • 类型:需求
  • 所属 Epic:#3
  • 所属 MVP / 版本:#35 / MVP-2
  • 阶段:已完成

原始需求

  • 来源:用户对话与已验收 #36/#37
  • 提出时间:2026-08-24
  • 脱敏摘要:面向现有受控用户交付安全的 API Key、OpenAPI 生成接口、限流、审计和必要管理页面;不开放注册、不自动删除数据、不增加计费或每日配额。

设计与原型门禁

  • 修改类型:生产实现
  • 已确认技术设计:Wiki Architecture-and-Code-Map,revision 1e8fea6c058d6d23f4a40183dd51708c8a4dae84
  • 已确认原型:prototypes/37/v1/index.html,#37 revision b65c47e5f701f67a8a06972e4f3e02c1f7bbd554
  • 状态:已确认(用户,2026-08-24)

依赖与并行

  • 前置工单:#41、#43,均已完成。
  • 是否允许并行:否;已在 OpenAPI 基础链路后接入治理。

要解决什么

实现用户、API Key、Provider 三维固定窗口限流和 Provider 受限时的 generation Defer CAS 延后,保持 retryable/attempt/circuit 红线。

做什么 / 不做什么

  • 做:显式正整数容量/窗口配置;user/key 429 + Retry-After;Provider 调用前限流、候选切换、全部受限延后;租约 token CAS;调度事件与并发测试。
  • 不做:每日配额、计费、持久化限流、多 portal 共享限流;本地限流不得伪装上游 429。

子项目影响

  • 影响:portal middleware、worker、internal/core/queue 与 platform 限流适配。
  • 原有 retryable 分类未修改;现有 429/5xx/超时/连接错误及 400/401/内容策略测试继续通过。

验收标准

  • user/key 超限为 429 且 Retry-After 正确,重启边界明确。
  • Provider 本地限流不调用上游、不写真实 Provider attempt、不改变熔断或失败终态。
  • 全候选受限时按最早时间 Defer,旧 lease 无法提交。
  • 配置缺失/非法时生产启动失败,测试 fixture 显式设置。
  • race、队列并发和 mock worker 回归通过。

文档影响

  • 已更新配置、队列调用路径、单实例限制和部署门禁。
  • Wiki revisions:
    • Architecture-and-Code-Map:e0125624a64ee0ed176215ca68009ec2efb5c25b
    • Business-Rules-and-Glossary:0e7981e5a175ace20cf406885050d701106963d3
    • Local-Development-and-Verification:ce59c50808fb1f9c8b80a49385962d4833cbe4da
    • Deployment-and-Operations:dca6da65b9f80b0278ce221847b671b4ecb86ba9

实施结果

  • 提交:af4afce(已推送 main)。
  • 固定窗口限流器支持多 bucket 原子占用与未开始上游调用时退还。
  • Portal 生成提交按用户限流,OpenAPI 已认证请求按 API Key 限流,OpenAPI 生成提交同时占用用户与 API Key bucket。
  • worker 在 Provider 调用前限流;全候选仅因本地限流不可用时按最早恢复时间 Defer,队列使用当前 lease token CAS。
  • OpenAPI 文档已声明 429 与整数 Retry-After。

验证证据

  • go test ./...、go vet ./...、go build ./...:通过。
  • go test -race -count=1 ./internal/platform/ratelimit ./portal/handler ./portal/worker ./internal/core/queue:通过。
  • go -C admin test ./...:通过。
  • MySQL:go test -count=1 -run TestMySQL ./internal/core/queue ./portal/worker 通过,使用 mock Provider;测试前暂停常驻 worker,测试后恢复。
  • python dev_scripts/harness.py check --strict、Wiki sync --check、git diff --check:通过。
  • Supervisor chorus-user 已运行新构建,OpenAPI 无密钥请求返回预期 401,进程保持稳定。
  • 未使用真实 Provider 额度。隔离测试库因当前数据库账号没有建库权限,MySQL 集成测试在确认无 pending/running 的受控本地开发库执行,测试数据已清理。

风险和回退

错误限流会丢任务或绕过保护;本次通过 mock、race 和真实 MySQL 并发路径验证。限流为单进程内存状态,重启会清空;多 portal 实例不共享计数。回退前确认 available_at 兼容,不能自动执行破坏性 down。

人工验收

  • 结果:通过
  • 确认人:用户
  • 确认时间:2026-08-25
  • 归档 revision:24dea7a9a6a3f6cead2a2268d3fa1e77f838ed60
## 基本信息 - 类型:需求 - 所属 Epic:#3 - 所属 MVP / 版本:#35 / MVP-2 - 阶段:已完成 ## 原始需求 - 来源:用户对话与已验收 #36/#37 - 提出时间:2026-08-24 - 脱敏摘要:面向现有受控用户交付安全的 API Key、OpenAPI 生成接口、限流、审计和必要管理页面;不开放注册、不自动删除数据、不增加计费或每日配额。 ## 设计与原型门禁 - 修改类型:生产实现 - 已确认技术设计:Wiki Architecture-and-Code-Map,revision `1e8fea6c058d6d23f4a40183dd51708c8a4dae84` - 已确认原型:`prototypes/37/v1/index.html`,#37 revision `b65c47e5f701f67a8a06972e4f3e02c1f7bbd554` - 状态:已确认(用户,2026-08-24) ## 依赖与并行 - 前置工单:#41、#43,均已完成。 - 是否允许并行:否;已在 OpenAPI 基础链路后接入治理。 ## 要解决什么 实现用户、API Key、Provider 三维固定窗口限流和 Provider 受限时的 generation Defer CAS 延后,保持 retryable/attempt/circuit 红线。 ## 做什么 / 不做什么 - 做:显式正整数容量/窗口配置;user/key 429 + Retry-After;Provider 调用前限流、候选切换、全部受限延后;租约 token CAS;调度事件与并发测试。 - 不做:每日配额、计费、持久化限流、多 portal 共享限流;本地限流不得伪装上游 429。 ## 子项目影响 - 影响:portal middleware、worker、internal/core/queue 与 platform 限流适配。 - 原有 retryable 分类未修改;现有 429/5xx/超时/连接错误及 400/401/内容策略测试继续通过。 ## 验收标准 - [x] user/key 超限为 429 且 Retry-After 正确,重启边界明确。 - [x] Provider 本地限流不调用上游、不写真实 Provider attempt、不改变熔断或失败终态。 - [x] 全候选受限时按最早时间 Defer,旧 lease 无法提交。 - [x] 配置缺失/非法时生产启动失败,测试 fixture 显式设置。 - [x] race、队列并发和 mock worker 回归通过。 ## 文档影响 - [x] 已更新配置、队列调用路径、单实例限制和部署门禁。 - Wiki revisions: - Architecture-and-Code-Map:`e0125624a64ee0ed176215ca68009ec2efb5c25b` - Business-Rules-and-Glossary:`0e7981e5a175ace20cf406885050d701106963d3` - Local-Development-and-Verification:`ce59c50808fb1f9c8b80a49385962d4833cbe4da` - Deployment-and-Operations:`dca6da65b9f80b0278ce221847b671b4ecb86ba9` ## 实施结果 - 提交:`af4afce`(已推送 main)。 - 固定窗口限流器支持多 bucket 原子占用与未开始上游调用时退还。 - Portal 生成提交按用户限流,OpenAPI 已认证请求按 API Key 限流,OpenAPI 生成提交同时占用用户与 API Key bucket。 - worker 在 Provider 调用前限流;全候选仅因本地限流不可用时按最早恢复时间 Defer,队列使用当前 lease token CAS。 - OpenAPI 文档已声明 429 与整数 `Retry-After`。 ## 验证证据 - `go test ./...`、`go vet ./...`、`go build ./...`:通过。 - `go test -race -count=1 ./internal/platform/ratelimit ./portal/handler ./portal/worker ./internal/core/queue`:通过。 - `go -C admin test ./...`:通过。 - MySQL:`go test -count=1 -run TestMySQL ./internal/core/queue ./portal/worker` 通过,使用 mock Provider;测试前暂停常驻 worker,测试后恢复。 - `python dev_scripts/harness.py check --strict`、Wiki `sync --check`、`git diff --check`:通过。 - Supervisor `chorus-user` 已运行新构建,OpenAPI 无密钥请求返回预期 401,进程保持稳定。 - 未使用真实 Provider 额度。隔离测试库因当前数据库账号没有建库权限,MySQL 集成测试在确认无 pending/running 的受控本地开发库执行,测试数据已清理。 ## 风险和回退 错误限流会丢任务或绕过保护;本次通过 mock、race 和真实 MySQL 并发路径验证。限流为单进程内存状态,重启会清空;多 portal 实例不共享计数。回退前确认 `available_at` 兼容,不能自动执行破坏性 down。 ## 人工验收 - 结果:通过 - 确认人:用户 - 确认时间:2026-08-25 - 归档 revision:`24dea7a9a6a3f6cead2a2268d3fa1e77f838ed60`
Author
Owner

实施完成,等待验收

  • 提交:af4afce,已推送至 main。
  • 核心验证:全量 Go 测试、vet、build、race、管理端回归、MySQL 队列与 mock worker 集成测试均通过。
  • 运行验证:Supervisor chorus-user 已部署新构建并稳定运行;未使用真实 Provider 额度。
  • 核心 Wiki 已更新并完成 sync --check。
  • 任务归档:Task-44-实现三维限流与生成队列延后,revision e3076f2ea9c50d0b7ad938d5416d85aed034adb9。
  • 未导出 docs/task/,符合任务归档仅按用户明确要求导出的规则。
  • 工单保持打开,阶段为“待验收”。
## 实施完成,等待验收 - 提交:`af4afce`,已推送至 `main`。 - 核心验证:全量 Go 测试、vet、build、race、管理端回归、MySQL 队列与 mock worker 集成测试均通过。 - 运行验证:Supervisor `chorus-user` 已部署新构建并稳定运行;未使用真实 Provider 额度。 - 核心 Wiki 已更新并完成 `sync --check`。 - 任务归档:`Task-44-实现三维限流与生成队列延后`,revision `e3076f2ea9c50d0b7ad938d5416d85aed034adb9`。 - 未导出 `docs/task/`,符合任务归档仅按用户明确要求导出的规则。 - 工单保持打开,阶段为“待验收”。
Author
Owner

人工验收通过

  • 用户于 2026-08-25 明确确认 #44 通过验收。
  • 实现提交:af4afce。
  • 任务归档已更新为“已完成”,revision 24dea7a9a6a3f6cead2a2268d3fa1e77f838ed60。
  • 核心 Wiki sync --check 通过。
  • #35 与 #3 的 #44 子工单索引已勾选;父工单因仍有后续范围保持打开。
  • 未导出 docs/task/。
## 人工验收通过 - 用户于 2026-08-25 明确确认 #44 通过验收。 - 实现提交:`af4afce`。 - 任务归档已更新为“已完成”,revision `24dea7a9a6a3f6cead2a2268d3fa1e77f838ed60`。 - 核心 Wiki `sync --check` 通过。 - #35 与 #3 的 #44 子工单索引已勾选;父工单因仍有后续范围保持打开。 - 未导出 `docs/task/`。
ila closed this issue 2026-08-25 09:33:47 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/chorus#44