一、功能目标

当文件上传完毕(无论是通过 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
func OnUploadComplete(fileMeta FileMeta) {
// 1. 查询该上传场景绑定的预计算规则
actions := repo.QueryPreActions(fileMeta.SceneID)

for _, action := range actions {
if matchCondition(fileMeta, action.TriggerCondition) {
switch action.ExecuteMode {
case MODE_ASYNC_MQ:
mq.Publish(action.ActionType, fileMeta)
case MODE_WEBHOOK:
http.Post(action.TargetURL, fileMeta)
case MODE_LOCAL:
runLocalAction(action, 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分钟后生成缩略图)

八、整体收益

✅ 跨云资源管理统一化
✅ 上传与后处理解耦
✅ 支持多协议与多执行通道
✅ 易于扩展(配置驱动,无需改代码)
✅ 支持灰度与回滚