预计算
一、功能目标
当文件上传完毕(无论是通过 SDK / API / 控制台上传),系统能够自动触发对应的 后处理动作,例如:
🎞 视频自动转码
🖼 图片缩略图生成
🧠 AI 内容分析(如标签识别、人脸检测)
🪣 元数据同步 / CDN 刷新 / 日志上报
目标是:
解耦上传与后处理;
支持灵活扩展;
支持异步高可用。
二、系统流程图(逻辑架构)
┌────────────────────────────┐
│ Upload SDK / API │
└──────────────┬─────────────┘
│ 上传成功回调
▼
┌──────────────────────┐
│ Upload Service │
│ (统一上传接入层) │
└──────────────────────┘
│
查询 cloud_process_pre_action
│
▼
┌───────────────────────────────────┐
│ PreAction Dispatcher │
│ (动作分发模块,匹配触发条件) │
└───────────────────────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ MQ Producer │ │ Webhook Caller │ │ Local Worker │
│ (Kafka/Rabbit) │ │ (HTTP 推送) │ │ (同步任务) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │
▼ ▼
┌────────────┐ ┌──────────────────┐
│ Consumer │ │ Third-Party API │
│ Worker Pool│ │ (AI/转码/ETL等) │
└────────────┘ └──────────────────┘
💡 设计说明:
Upload Service 是统一入口,可内嵌于文件网关模块。
Dispatcher 查询 cloud_process_pre_action 表,根据规则匹配哪些动作需要触发。
动作触发支持三种模式:
MQ 模式:异步队列(推荐)
Webhook 模式:直连下游服务(适合内部系统)
Local Worker 模式:轻量化同步处理(适合小业务)
三、事件时序图(Sequence Diagram)
以下为一次「上传 → 自动转码 + AI分析」的完整时序:
┌──────────────┐ ┌────────────────┐ ┌──────────────────────┐ ┌────────────────────────┐
│ Client SDK │ │ Upload Service │ │ PreAction Dispatcher │ │ PreAction Worker/Hook │
└──────┬───────┘ └────────┬───────┘ └────────────┬────────┘ └───────────────┬────────┘
│ 上传请求 │ │ │
│─────────────────────>│ │ │
│ │ 文件上传成功 │ │
│ │ 生成文件meta信息 │ │
│ │ 查询 pre_action 配置 │ │
│ │────────────────────────>│ │
│ │ │ 匹配trigger_condition │
│ │ │ 生成任务事件(event msg) │
│ │<────────────────────────│ │
│ │ 推送MQ / Webhook / 本地任务 │ │
│ │────────────────────────>│ │
│ │ │ │
│ │ │ 执行动作:转码/缩略图/AI等 │
│ │ │─────────────────────────>│
│ │ │ │
│ │ │ <─回调结果/更新状态──────│
│ │ │ │
四、触发机制逻辑(伪代码示例)
1 | func OnUploadComplete(fileMeta FileMeta) { |
✅ 说明:
matchCondition 用于判断 MIME、文件大小、标签、上传场景等条件。
支持多种触发模式(异步消息 / Webhook / 本地执行)。
可结合任务状态表记录每次动作执行的结果。
五、cloud_process_pre_action 表字段扩展建议
| 字段名 | 类型 | 描述 |
|---|---|---|
| id | bigint | 主键 |
| upload_id | bigint | 关联上传配置 |
| action_type | varchar(32) | 动作类型(transcode、thumbnail、ai、sync等) |
| action_name | varchar(64) | 自定义动作名 |
| trigger_condition | varchar(256) | JSON规则:{"mime":"image/*","size_lt":10485760} |
| execute_mode | tinyint | 1异步(MQ) 2Webhook 3本地执行 |
| target_url | varchar(256) | Webhook地址或MQ topic名 |
| retry_strategy | varchar(64) | 失败重试策略(如3x@5min) |
| status | tinyint | 状态:1启用 9关闭 |
| creator / modifier | varchar(32) | 创建/修改者 |
| create_time / modify_time | datetime | 创建/修改时间 |
六、预计算触发机制实现建议
| 组件 | 说明 | 推荐实现 |
|---|---|---|
| MQ 消息队列 | 解耦上传与后处理 | Kafka / RabbitMQ / RocketMQ |
| Worker Pool | 异步消费任务 | Go 协程池、Celery、Sidekiq |
| Webhook 调用器 | 与外部系统联动 | 支持签名校验、重试 |
| 任务日志表 | 记录动作执行结果 | cloud_process_action_log |
| 缓存层 | 加速 pre_action 配置查询 | Redis / Etcd |
七、可扩展场景
| 场景 | 描述 |
|---|---|
| 视频转码链式任务 | 上传 → 触发转码 → 转码完成 → 回调刷新CDN |
| AI标签识别 | 上传图片 → AI服务分析 → 回写标签到DB |
| 数据同步 | 上传成功 → 触发Meta同步到搜索系统 |
| 延迟处理 | 上传后延迟触发(如5分钟后生成缩略图) |
八、整体收益
✅ 跨云资源管理统一化
✅ 上传与后处理解耦
✅ 支持多协议与多执行通道
✅ 易于扩展(配置驱动,无需改代码)
✅ 支持灰度与回滚
