feat: 任务队列限流防护 #220

Merged
xiaoxia merged 2 commits from feat/task-queue-rate-limit into develop 2026-07-11 16:29:08 +08:00

2 Commits

Author SHA1 Message Date
用户CI Test c5c3e0975b fix(queue-limit): P1修复 - 阈值抽常量 + 边界统一 + 入队后兜底校验
- 阈值统一管理:USER_PENDING_LIMIT/GLOBAL_PENDING_LIMIT 抽到 task_enqueue.py 常量,所有入口引用
- 边界判断统一:预检查用 >=(任务创建前),入队检查用 >(包含当前任务),语义一致
- 并发竞态兜底:发送Celery后再查一次DB计数,超限则回滚任务为failed
- 新增 12 个单元测试(入队后兜底5个 + 边界验证7个)
2026-07-11 16:24:58 +08:00
用户CI Test f45baa2ce0 feat: 任务队列限流防护 - 用户级3个/全局20个
实现3层队列防护,防止批量提交导致队列爆炸:

**用户级限流(核心)**
- 每个用户同时 pending 的 generation 任务上限 3 个
- 超限返回 429:您的待处理任务过多,请等待完成后再提交

**全局限流(兜底)**
- 系统 pending 任务超过 20 个一律拒绝
- 返回 503:系统繁忙,请稍后再试

**覆盖的入口**
- 一键生成(generation_tasks 批量创建 + 重试)
- 剪辑计划生成(edit_plans generate)
- 任务中心重试(task_center 用户级 + 项目级)

**实现细节**
- 预检查 + 入队前检查双重保障
- 限流拒绝时任务标记为 failed,避免 pending 僵尸
- repository 不支持计数时自动降级跳过(兼容旧代码)
- 全局检查始终生效,用户级检查需传 user_id

**新增**
- task_enqueue.py: UserPendingLimitExceeded / GlobalQueueFull 异常
- generation_task_repository: count_pending_by_user / count_pending_total
- 13个单元测试,覆盖正常/超限/全局/降级等场景
2026-07-11 16:13:11 +08:00