338 lines
5.9 KiB
Markdown
Executable File
338 lines
5.9 KiB
Markdown
Executable File
# 12_任务队列_错误重试_稳定性设计
|
||
|
||
## 1. 文档目标
|
||
|
||
本文档定义系统 B 的任务队列、状态机、幂等、重试、错误码、恢复机制和并发控制。
|
||
|
||
## 2. 为什么必须队列化
|
||
|
||
系统 B 的生成链路长且耗时:
|
||
|
||
```text
|
||
照片检测
|
||
人物档案
|
||
方案生成
|
||
预览图
|
||
正式图
|
||
图片质检
|
||
TTS
|
||
字幕
|
||
视频合成
|
||
最终质检
|
||
人工审核
|
||
```
|
||
|
||
如果同步执行,容易导致:
|
||
|
||
- 请求超时
|
||
- 用户重复点击
|
||
- 服务阻塞
|
||
- 失败无法恢复
|
||
- 成本无法追踪
|
||
|
||
## 3. 队列划分
|
||
|
||
```text
|
||
photo_check_queue:照片检测
|
||
text_queue:方案、文案、Prompt
|
||
image_queue:预览图、正式图
|
||
video_queue:AI 图生视频
|
||
voice_queue:TTS
|
||
audio_queue:BGM 处理
|
||
ffmpeg_queue:视频合成
|
||
qc_queue:质量检测
|
||
cleanup_queue:文件清理
|
||
notification_queue:通知
|
||
```
|
||
|
||
## 4. 任务状态
|
||
|
||
```text
|
||
pending:等待执行
|
||
running:执行中
|
||
success:成功
|
||
failed:失败
|
||
retrying:重试中
|
||
cancelled:取消
|
||
manual_required:需要人工处理
|
||
```
|
||
|
||
## 5. 任务字段
|
||
|
||
每个任务必须有:
|
||
|
||
```text
|
||
task_id
|
||
project_id
|
||
task_type
|
||
provider_id
|
||
status
|
||
input_json
|
||
input_hash
|
||
output_asset_id
|
||
provider_request_id
|
||
retry_count
|
||
max_retry
|
||
cost_estimate
|
||
cost_actual
|
||
error_code
|
||
error_message
|
||
created_at
|
||
started_at
|
||
finished_at
|
||
```
|
||
|
||
## 6. 幂等设计
|
||
|
||
幂等 key:
|
||
|
||
```text
|
||
project_id + task_type + input_hash
|
||
```
|
||
|
||
规则:
|
||
|
||
- 如果已有成功任务,直接返回成功结果。
|
||
- 如果已有运行任务,返回当前任务状态。
|
||
- 如果已有失败任务,按重试规则处理。
|
||
- 同一请求不能重复创建多个高成本任务。
|
||
|
||
## 7. 项目级锁
|
||
|
||
某些任务必须串行:
|
||
|
||
- 创作方案生成
|
||
- 视频合成
|
||
- 最终交付
|
||
|
||
使用 Redis lock:
|
||
|
||
```text
|
||
lock:project:{project_id}:workflow
|
||
```
|
||
|
||
避免并发触发导致状态混乱。
|
||
|
||
## 8. 重试策略
|
||
|
||
默认:
|
||
|
||
```text
|
||
max_retry = 3
|
||
backoff = exponential
|
||
```
|
||
|
||
例如:
|
||
|
||
```text
|
||
第 1 次失败:30 秒后重试
|
||
第 2 次失败:2 分钟后重试
|
||
第 3 次失败:5 分钟后重试
|
||
```
|
||
|
||
不可重试错误:
|
||
|
||
- 用户照片不合格
|
||
- 余额不足
|
||
- 授权未确认
|
||
- 内容审核不通过
|
||
- 套餐限制冲突
|
||
|
||
可重试错误:
|
||
|
||
- Provider 超时
|
||
- 网络错误
|
||
- 速率限制
|
||
- 临时服务异常
|
||
- FFmpeg 临时失败
|
||
|
||
## 9. 失败转人工
|
||
|
||
满足任一条件转人工:
|
||
|
||
- 同一任务连续失败超过 max_retry
|
||
- 图片质检连续失败
|
||
- 人像一致性评分过低
|
||
- 视频合成失败
|
||
- 审核 warning
|
||
- 高端定制项目
|
||
|
||
状态:
|
||
|
||
```text
|
||
manual_required
|
||
```
|
||
|
||
## 10. 并发限制
|
||
|
||
### 用户级
|
||
|
||
```text
|
||
每个用户最多同时 1 个正式生成项目
|
||
```
|
||
|
||
### 项目级
|
||
|
||
```text
|
||
每个项目最多同时 N 个图片任务
|
||
视频合成任务只能 1 个
|
||
```
|
||
|
||
### Provider 级
|
||
|
||
```text
|
||
按 Provider 设置 QPS 和并发数
|
||
```
|
||
|
||
## 11. 队列优先级
|
||
|
||
优先级建议:
|
||
|
||
1. 高端定制项目
|
||
2. 已支付正式生成
|
||
3. 预览生成
|
||
4. 免费预览
|
||
5. 清理任务
|
||
|
||
## 12. 错误码设计
|
||
|
||
| 错误码 | 含义 |
|
||
|---|---|
|
||
| TASK_TIMEOUT | 任务超时 |
|
||
| PROVIDER_TIMEOUT | Provider 超时 |
|
||
| PROVIDER_RATE_LIMIT | Provider 限流 |
|
||
| PROVIDER_ERROR | Provider 错误 |
|
||
| INPUT_INVALID | 输入参数错误 |
|
||
| PHOTO_QUALITY_FAIL | 照片质量不合格 |
|
||
| PAYMENT_REQUIRED | 需要支付 |
|
||
| QUOTA_NOT_ENOUGH | 额度不足 |
|
||
| MODERATION_REJECTED | 审核不通过 |
|
||
| FFMPEG_FAILED | 视频合成失败 |
|
||
| STORAGE_FAILED | 存储失败 |
|
||
| UNKNOWN_ERROR | 未知错误 |
|
||
|
||
## 13. 任务恢复
|
||
|
||
服务重启后:
|
||
|
||
1. 扫描 running 超时任务。
|
||
2. 判断是否有 Provider request_id。
|
||
3. 查询 Provider 状态,能恢复则恢复。
|
||
4. 无法恢复则标记 failed 并按规则重试。
|
||
|
||
## 14. 状态一致性
|
||
|
||
项目状态由 WorkflowService 统一更新。不要让 Worker 随意改最终状态。
|
||
|
||
Worker 只上报:
|
||
|
||
```text
|
||
task success/failed
|
||
output asset
|
||
progress
|
||
error
|
||
```
|
||
|
||
WorkflowService 根据任务完成情况推进项目状态。
|
||
|
||
## 15. 防重复点击
|
||
|
||
前端:按钮 loading,防抖。
|
||
后端:幂等 key + 状态校验。
|
||
|
||
例如:
|
||
|
||
- 已在 preview_generating,不允许再次 generate-preview。
|
||
- 已 payment_paid,不允许重复创建同一套餐订单。
|
||
|
||
## 16. 任务超时设置
|
||
|
||
建议:
|
||
|
||
```text
|
||
photo_check:2 分钟
|
||
text_generate:3 分钟
|
||
image_generate:10 分钟
|
||
video_generate:30 分钟
|
||
voice_generate:5 分钟
|
||
ffmpeg_render:30 分钟
|
||
final_qc:10 分钟
|
||
```
|
||
|
||
## 17. 告警
|
||
|
||
触发告警:
|
||
|
||
- 失败任务数超过阈值
|
||
- 某 Provider 连续失败
|
||
- 队列积压过多
|
||
- 视频合成失败率过高
|
||
- 单项目成本异常
|
||
- 磁盘/MinIO 容量不足
|
||
|
||
## 18. 日志要求
|
||
|
||
每个任务记录:
|
||
|
||
- 输入摘要
|
||
- 输出摘要
|
||
- Provider
|
||
- 成本
|
||
- 耗时
|
||
- 错误
|
||
- 重试次数
|
||
|
||
敏感数据脱敏保存。
|
||
|
||
## 19. V3 真人动态视频队列增量
|
||
|
||
新增队列:
|
||
|
||
```text
|
||
identity_anchor_queue:身份锚点生成
|
||
face_consistency_queue:本人相似度检查
|
||
motion_portrait_queue:动态写真轻动效
|
||
real_video_clip_queue:真人动态视频片段
|
||
video_clip_qc_queue:视频片段质检
|
||
lipsync_queue:口型同步
|
||
```
|
||
|
||
隔离原则:
|
||
|
||
- `real_video_clip_queue` 必须独立限流,避免高成本视频任务堵住图片和普通合成。
|
||
- `lipsync_queue` 独立限流,失败不影响基础旁白字幕交付。
|
||
- `face_consistency_queue` 可优先级较高,因为它决定是否能继续生成。
|
||
|
||
V3 超时建议:
|
||
|
||
```text
|
||
identity_anchor_generate:10 分钟
|
||
face_consistency_check:3 分钟
|
||
motion_portrait_generate:20 分钟
|
||
real_video_clip_generate:60 分钟
|
||
video_clip_qc:10 分钟
|
||
lipsync_generate:45 分钟
|
||
```
|
||
|
||
V3 错误码:
|
||
|
||
```text
|
||
IDENTITY_ANCHOR_NOT_CONFIRMED
|
||
FACE_CONSISTENCY_LOW
|
||
REAL_VIDEO_PROVIDER_DISABLED
|
||
REAL_VIDEO_CONFIRMATION_REQUIRED
|
||
REAL_VIDEO_COST_LIMIT_EXCEEDED
|
||
REAL_VIDEO_CLIP_FAILED
|
||
VIDEO_CLIP_QC_FAILED
|
||
LIPSYNC_FAILED
|
||
MINOR_MANUAL_REVIEW_REQUIRED
|
||
```
|
||
|
||
真实视频任务失败时:
|
||
|
||
1. 记录 Provider 错误。
|
||
2. 标记片段 failed 或 needs_retry。
|
||
3. 不回落 mock 假成功。
|
||
4. 不重复扣用户额度。
|
||
5. 用户端显示失败原因和重试入口。
|