Temporal是什么
Temporal 是: Temporal 可以理解为“生产级长任务/多步骤流程的可靠执行系统”。它解决的不是“AI 怎么思考”,而是: 一个业务流程跑到一半失败、超时、服务重启、Worker 挂掉之后,系统还能不能记住进度,并继续把任务跑完。 Temporal 官方把 Workflow Execution 定义为一种…
作者:lh
Temporal 是:
Temporal 可以理解为“生产级长任务/多步骤流程的可靠执行系统”。它解决的不是“AI 怎么思考”,而是:
一个业务流程跑到一半失败、超时、服务重启、Worker 挂掉之后,系统还能不能记住进度,并继续把任务跑完。
Temporal 官方把 Workflow Execution 定义为一种 durable, reliable, scalable function execution,也就是“持久、可靠、可扩展的函数执行”。它的 Task Queue 里的任务会持久保存;Worker 掉线后,任务不会丢,等 Worker 恢复后可以继续处理。
1. 先用一句话理解 Temporal
普通后端任务是:
程序运行中 → 程序挂了 → 状态丢了 → 任务失败
Temporal 是:
程序运行中 → 程序挂了 → Temporal 记得执行历史 → 换个 Worker 继续跑
所以它的核心价值是:
让长流程任务像普通函数一样写,但具备断点恢复、自动重试、超时控制、状态持久化能力。
2. 为什么需要 Temporal?
比如你的视频分析系统:
1. 用户上传视频 2. 保存视频文件 3. 提取音频 4. 音频转文字 5. 调用大模型分析 transcript 6. 生成摘要 7. 匹配标签 8. 保存数据库 9. 返回结果
如果第 5 步调用大模型时失败了,普通系统可能会出现这些问题:
任务挂了 状态丢了 用户不知道分析到哪一步 重复执行整个流程 数据库写了一半 文件生成了一半 需要人工排查
Temporal 的作用就是把这种流程变成:
第 1-4 步已经成功 第 5 步失败 Temporal 记录失败位置 按照重试策略重新执行第 5 步 成功后继续第 6-9 步
它不是单纯“异步执行”,而是可靠地执行整个业务流程。
3. Temporal 的几个核心概念
3.1 Workflow:业务流程本身
Workflow 就是你定义的完整业务流程。
比如:
VideoAnalysisWorkflow
里面可以写:
保存视频 提取音频 ASR转文字 LLM分析 保存结果
Workflow 更像“大脑”或者“流程图”。
它负责决定:
先做什么 后做什么 失败后怎么办 什么时候超时 是否并行执行 是否等待人工确认
3.2 Activity:真正干活的步骤
Activity 是 Workflow 里面的一个个具体任务。
例如:
save_video() extract_audio() transcribe_audio() call_llm() save_result()
这些才是真正会访问外部系统的代码,比如:
读写数据库 调用大模型 API 读写 MinIO/OSS 调用 FFmpeg 请求第三方接口
Temporal 里一般有一个重要原则:
Workflow 负责流程控制 Activity 负责具体执行
也就是:
Workflow 不直接干重活 Activity 去干重活
3.3 Worker:执行 Workflow 和 Activity 的进程
Worker 就是跑在你服务器上的进程。
它会去 Temporal 的 Task Queue 里拉任务,然后执行。
类似:
Worker A:处理视频任务 Worker B:处理 ASR 任务 Worker C:处理 LLM 分析任务
如果 Worker 挂了,Temporal 里的任务还在。官方文档也说明,Workflow 和 Activity Tasks 会持久存在于 Task Queue 中,Worker 掉线后任务会保留,直到 Worker 恢复并处理。
3.4 Task Queue:任务队列
Task Queue 是 Temporal 分发任务的地方。
你可以理解成:
Temporal Server 把任务放到 Task Queue Worker 从 Task Queue 拉任务执行
比如:
video-task-queue llm-task-queue asr-task-queue
这样可以把不同任务交给不同类型的 Worker。
3.5 Temporal Server:调度和记录中心
Temporal Server 不直接执行你的业务代码。
它主要负责:
记录 Workflow 执行历史 调度任务 管理重试 管理超时 管理状态 把任务分发给 Worker
Temporal Server 后面一般会有数据库,例如 PostgreSQL、MySQL、Cassandra 等,用来保存 Workflow 的执行历史和状态。
4. Temporal 最重要的机制:Event History
Temporal 最核心的东西是 Event History,也就是“执行历史”。
比如一个视频任务跑过这些步骤:
Workflow Started Activity save_video Scheduled Activity save_video Completed Activity extract_audio Scheduled Activity extract_audio Completed Activity transcribe_audio Scheduled Activity transcribe_audio Failed Activity transcribe_audio Retried Activity transcribe_audio Completed Activity call_llm Scheduled
Temporal 会把这些关键事件记录下来。
所以当 Worker 挂了之后,它不是“凭感觉恢复”,而是根据历史记录恢复:
前面哪些步骤成功了? 哪些步骤失败了? 哪些步骤需要重试? Workflow 当前应该继续到哪里?
官方文档提到,Workflow Task 执行时,Worker 会 replay 代码,并基于 Event History 做决策;Activity 的结果会来自历史记录,replay 时不会真的重新执行 I/O。
这点非常关键。
5. Temporal 怎么做到“服务器挂了也能继续”?
假设你的流程是:
result1 = step_a() result2 = step_b(result1) result3 = step_c(result2)
普通程序:
step_a 成功 step_b 成功 step_c 之前服务器挂了 变量 result1/result2 丢了 任务失败
Temporal:
step_a 成功 → 记录到 Event History step_b 成功 → 记录到 Event History 服务器挂了 新 Worker 启动 Temporal replay Workflow 恢复 result1/result2 继续执行 step_c
所以 Temporal 的本质不是“程序一直不挂”,而是:
程序可以挂,但执行历史不能丢;只要历史还在,就可以恢复。
Temporal 的 Durable Execution 也常被解释为 crash-proof execution,也就是程序崩溃后仍能恢复执行。
6. Temporal 和 Celery / Redis 最大区别
这套架构是:
FastAPI 接收任务 Celery 把任务丢进队列 Worker 执行任务 Redis 作为 broker
适合简单异步任务。
但是 Celery 更像:
执行一个任务
Temporal 更像:
管理一个完整业务流程
对比一下:
| 对比项 | Celery | Temporal |
|---|---|---|
| 核心定位 | 异步任务队列 | 持久工作流引擎 |
| 适合任务 | 简单后台任务 | 多步骤、长时间、强可靠流程 |
| 状态记录 | 需要自己设计 | Temporal 自动记录执行历史 |
| 失败重试 | 支持,但偏任务级 | 支持,并且和流程状态结合 |
| 断点恢复 | 较弱,需要自己写 | 核心能力 |
| 多步骤流程 | 需要自己串联 | 原生支持 |
| 补偿事务 | 需要自己设计 | 适合 Saga 模式 |
| 长时间等待 | 不太优雅 | 原生支持 Timer/Sleep |
| 可观测性 | 需要额外搭建 | Temporal Web 可看 Workflow 状态 |
| 学习成本 | 较低 | 较高 |
简单说:
Celery = 把一个函数丢后台跑 Temporal = 把一个业务流程可靠地跑到底
7. Temporal 的典型能力
7.1 自动重试
比如 LLM API 超时:
第一次调用失败 等待 5 秒 第二次失败 等待 30 秒 第三次失败 等待 2 分钟 成功后继续流程
你不需要在每个地方手写复杂重试逻辑,可以给 Activity 配 retry policy。
7.2 超时控制
Temporal 可以控制:
这个 Activity 最多执行多久 这个 Workflow 最多运行多久 这个任务多久没人接就超时 这个任务从调度到完成最多多久
这对视频分析很有用。
比如:
ASR 最多跑 30 分钟 LLM 分析最多 5 分钟 整个视频分析流程最多 2 小时
7.3 断点恢复
比如流程跑到这里:
保存视频 ✅ 提取音频 ✅ ASR 转文字 ✅ LLM 分析 ❌
Temporal 不需要重头来:
不用重新保存视频 不用重新提取音频 不用重新 ASR 只需要重试 LLM 分析
这对成本很重要,因为 ASR 和 LLM 都可能花钱。
7.4 长时间等待
Temporal 很适合这种流程:
提交申请 等待人工审核 3 天后自动提醒 7 天未处理自动关闭
普通系统要写定时任务、状态表、轮询逻辑。
Temporal 可以直接在 Workflow 里表达:
等待人工信号 或者等待 7 天超时
7.5 人工介入
Temporal 支持 Signal,也就是外部可以给正在运行的 Workflow 发消息。
例如:
视频分析结果置信度低 ↓ Workflow 暂停 ↓ 等待管理员确认标签 ↓ 管理员确认后继续保存结果
这个就很适合你的视频标签审核系统。
7.6 补偿事务 / Saga
比如一个流程有多个步骤:
扣库存 创建订单 调用支付 生成发票 通知用户
如果后面失败了,可能要回滚前面的动作。
Temporal 可以很适合实现 Saga:
第 1 步成功 第 2 步成功 第 3 步失败 执行补偿: 撤销订单 恢复库存
在你的视频系统里也可以类似:
上传文件成功 数据库任务创建成功 ASR 文件生成成功 LLM 失败 补偿: 清理临时音频 标记任务失败 保留原视频
8. Temporal 的运行结构
典型架构是:
FastAPI ↓ Temporal Client ↓ Temporal Server ↓ Task Queue ↓ Worker ↓ Activity 执行具体任务
放到你的系统里:
用户上传视频 ↓ FastAPI 保存视频到 MinIO/OSS ↓ FastAPI 启动 Temporal Workflow ↓ Temporal Server 记录 Workflow ↓ Worker 执行 extract_audio Activity ↓ Worker 执行 ASR Activity ↓ Worker 执行 LangGraph Analysis Activity ↓ Worker 执行 save_result Activity ↓ PostgreSQL 更新任务状态
9. 和 LangGraph 组合时怎么分工?
你前面问的 Temporal + LangGraph,最合理的关系是:
Temporal 管外层任务可靠性 LangGraph 管内层 AI 决策逻辑
比如:
Temporal Workflow: 1. save_video 2. extract_audio 3. transcribe_audio 4. analyze_with_langgraph 5. validate_result 6. save_result
其中:
analyze_with_langgraph
内部可以是 LangGraph:
读取 transcript ↓ 判断 primary_label ↓ 查询标签体系 ↓ 选择 2-6 个三级标签 ↓ 检查标签是否重复/过窄 ↓ 生成摘要 ↓ 输出 JSON
也就是说:
Temporal 不负责“AI 怎么想” LangGraph 不负责“任务挂了怎么恢复”
组合起来就是:
Temporal = 可靠执行外壳 LangGraph = AI 分析大脑
10. 用 Temporal 改造你的视频分析系统
你现在可能是:
FastAPI ↓ Celery Task ↓ process_video()
里面可能写成:
def process_video(task_id):
extract_audio()
transcribe()
call_llm()
save_result()
问题是:
中间失败后,不好知道到哪一步 重试可能重头开始 状态要自己维护 任务链路长了很难 debug
Temporal 版本可以设计成:
VideoAnalysisWorkflow ├── save_video_activity ├── extract_audio_activity ├── transcribe_activity ├── analyze_transcript_activity ├── validate_labels_activity ├── save_result_activity └── cleanup_activity
每一步都可以单独配置:
重试次数 超时时间 失败处理 是否可并行 是否需要补偿
11. 一个伪代码例子
不要纠结语法,先看结构:
@workflow.defn
class VideoAnalysisWorkflow:
@workflow.run
async def run(self, task_id: str, video_path: str):
audio_path = await workflow.execute_activity(
extract_audio,
video_path,
start_to_close_timeout=timedelta(minutes=10),
retry_policy=RetryPolicy(maximum_attempts=3),
)
transcript = await workflow.execute_activity(
transcribe_audio,
audio_path,
start_to_close_timeout=timedelta(minutes=30),
retry_policy=RetryPolicy(maximum_attempts=5),
)
analysis = await workflow.execute_activity(
analyze_with_langgraph,
transcript,
start_to_close_timeout=timedelta(minutes=5),
retry_policy=RetryPolicy(maximum_attempts=3),
)
await workflow.execute_activity(
save_result,
task_id,
analysis,
start_to_close_timeout=timedelta(minutes=2),
)
return analysis
这个流程的意思是:
提取音频失败 → 最多重试 3 次 ASR 失败 → 最多重试 5 次 LangGraph 分析失败 → 最多重试 3 次 保存结果失败 → 单独处理
关键是:
前面成功的结果会被 Temporal 记录下来,不需要你自己到处写状态恢复逻辑。
12. Temporal 适合哪些场景?
非常适合:
视频处理流程
AI 分析管道
订单履约
支付流程
退款流程
物流跟踪
数据同步
爬虫任务
审批流程
风控流程
多系统调用
需要人工确认的流程
长期等待任务
不太适合:
非常简单的一次性小任务
毫秒级高频计算
纯缓存任务
只需要简单定时任务
没有失败恢复要求的小项目
13. Temporal 的缺点
它不是没有成本。
主要缺点是:
学习成本比 Celery 高
架构更重
需要部署 Temporal Server
需要理解 Workflow / Activity / Worker / Task Queue
Workflow 代码要遵守确定性要求
本地开发调试需要适应
小项目可能显得过度设计
尤其要注意一个点:
Workflow 代码要“确定性”
Temporal 的 Workflow 会 replay,所以 Workflow 里面不能随便写不确定逻辑。
比如不要在 Workflow 里面直接写:
random.random()
datetime.now()
requests.get()
这些应该放到 Activity 里面。
正确理解是:
Workflow 写流程控制
Activity 写外部调用和不确定操作
14. 你的项目什么时候该用 Temporal?
如果你现在只是:
用户上传视频
后台分析
返回结果
而且失败了可以手动重跑,那么:
Celery + Redis + PostgreSQL 暂时够用
如果你开始遇到这些问题:
视频任务经常跑一半失败
LLM / ASR 经常超时
用户任务不能丢
需要知道每一步状态
需要断点续跑
需要自动重试
需要人工审核
需要多个 Worker 分工
任务越来越长
那就很适合引入 Temporal。
15. 最适合你的架构建议
你的最终架构可以是:
FastAPI
↓
PostgreSQL:用户、任务、结果、标签体系
↓
MinIO / OSS:视频、音频、截图、结果文件
↓
Temporal:编排视频分析长流程
↓
Worker:执行具体任务
↓
LangGraph:处理 transcript 分析和标签选择
↓
Vector DB:标签体系/课程知识/历史案例检索
↓
LLM API:摘要、标签理由、结构化输出
更具体一点:
FastAPI:
接收上传、返回 task_id、查询任务状态
Temporal:
管理任务从上传到完成的全流程
Worker:
跑 FFmpeg、ASR、LLM、数据库写入
LangGraph:
做标签判断、摘要生成、工具调用
PostgreSQL:
存任务状态、用户信息、分析结果
MinIO/OSS:
存视频、音频、图片、大文件
Redis:
可保留做缓存、限流、临时状态,但不再作为核心任务可靠性来源
16. 最简单的理解总结
你可以这样记:
Celery:把任务丢给后台跑
Temporal:让复杂任务可靠地跑完
LangGraph:让 AI 知道下一步该干嘛
对于你的系统:
Temporal 解决“任务会不会丢、失败后怎么恢复”
LangGraph 解决“AI 怎么分析、怎么调用工具”
PostgreSQL 解决“业务数据怎么存”
MinIO/OSS 解决“大文件怎么存”
Redis 解决“缓存和临时加速”