Durable Workflow · Temporal 与 Agent 控制面分工
🏠 返回 04-README | ⬅️ 03-Java-Agent编排 | ➡️ 02-Buy领域智能体
定位:回答 Staff 白板 「LangGraph checkpoint 够了为什么还要 Temporal?」——Agent 环内状态 vs 跨天业务流程 的分工。Java 编排选型见 03;LangGraph interrupt 见 04-Agent框架;checkpoint 语义见 96 §2.0、13 §9.4。
L1 · 是什么
1.1 一句话定义
Temporal(或同类 durable execution 引擎)管理 长寿命、多角色、强审计 的业务流程;Agent Runtime(Spring AI loop / LangGraph)管理 秒–分钟级 的推理–工具循环。二者通过 Activity 边界 衔接:Workflow 定「何时、谁批、是否可重试」;Agent 定「这一步怎么推理、调哪些 tool」。
1.2 选型决策树
flowchart TD
Q[任务时长?] -->|秒–分钟| A[Agent Runtime<br/>LangGraph / Spring AI]
Q -->|小时–天| B{需要人工审批链?}
B -->|是| T[Temporal / Camunda]
B -->|否| C{仅进程续跑?}
C -->|是| CP[LangGraph Checkpoint<br/>Postgres/Redis]
C -->|否| A
T --> A2[每步 Activity 内调 Agent]
| 场景 | 推荐 | 反例 |
|---|---|---|
| 客服单轮 RAG | Spring AI loop | 上 Temporal 过重 |
| 退款 3 天多级审批 | Temporal + Agent Activity | 纯 checkpoint 难审计 SLA |
| 99% 完成 OOM | LangGraph checkpoint 续跑 | Temporal 不替代步内状态 |
| 大促批处理补发 | Temporal 批 Workflow | 同步 HTTP Agent |
1.3 与 Spring Statemachine 对照(03)
| 方案 | 甜区 | 与 Temporal |
|---|---|---|
| Spring Statemachine | 单 JVM、表单式状态 | 无跨进程 durability |
| Plan-Execute 自研 | 中等复杂度 | 自研持久化 ≈ 半套 Temporal |
| Temporal | 分布式、重试、定时器、审计 | 生产首选(长流程) |
L2 · 架构分工
2.1 两平面模型
flowchart TB
subgraph temporal [Temporal 控制面]
WF[RefundWorkflow]
WF --> A1[Activity: collectSlots]
WF --> A2[Activity: runAgentPlan]
WF --> A3[Activity: waitHumanApproval]
WF --> A4[Activity: executeRefund]
end
subgraph agent [Agent 数据面]
AG[Spring AI / LangGraph]
AG --> LLM[LLM]
AG --> TOOL[Tools / RAG]
end
A2 --> AG
A1 --> AG
AG --> CP[(Checkpoint<br/>步内状态)]
WF --> AUD[(Workflow History<br/>审计)]
| 存储 | 内容 | 续跑问题 |
|---|---|---|
| Workflow History | 活动完成记录、定时器、信号 | 「审批到了吗」 |
| Agent Checkpoint | messages、plan[]、tool 轨迹 | 「这一步 LLM 跑到哪」 |
| 向量库 | 知识 | 「政策文本是什么」——不用于续跑 |
2.2 Activity 设计原则
- Activity 要幂等:
executeRefund(orderId, idempotencyKey)。 - Activity 粒度 = 业务原子步,不是「一次 LLM call」。
- LLM 环放在 Activity 内,Activity 超时 > LLM P99 + 工具链。
- HITL 用
Workflow.awaitCondition/ Signal,不要阻塞 HTTP 线程。
2.3 Java 示意(Temporal Java SDK · L1)
API 以 Temporal Java SDK 为准;以下为面试示意结构。
@WorkflowInterface
public interface RefundWorkflow {
@WorkflowMethod
RefundResult run(RefundRequest req);
}
public class RefundWorkflowImpl implements RefundWorkflow {
private final RefundActivities acts = Workflow.newActivityStub(
RefundActivities.class,
ActivityOptions.newBuilder()
.setStartToCloseTimeout(Duration.ofMinutes(5))
.setRetryOptions(RetryOptions.newBuilder()
.setMaximumAttempts(3).build())
.build());
@Override
public RefundResult run(RefundRequest req) {
SlotBundle slots = acts.collectSlots(req);
AgentPlan plan = acts.runAgentPlan(req, slots); // 内部 Spring AI + checkpoint
acts.waitHumanApproval(req.orderId(), plan.riskSummary());
return acts.executeRefund(req.orderId(), req.idempotencyKey());
}
}
Agent Activity 内部仍可用 03 Plan-Execute + Redis checkpoint;Temporal 只保证 Activity 级 至少一次执行与超时重试。
2.4 LangGraph interrupt vs Temporal Signal
| 机制 | 层次 | 典型用法 |
|---|---|---|
LangGraph interrupt() | Agent 图内人审 | 单会话暂停/恢复 |
| Temporal Signal | 业务流程 | 经理手机点「批准」恢复 Workflow |
| Temporal Query | 只读状态 | 工单系统展示进度 |
组合:客服 Agent 图内 interrupt 收集材料 → Workflow 进入 waitHumanApproval → Signal approved → 下一 Activity 调写工具。
L3 · 生产要点
3.1 版本与部署
| 对象 | 策略 |
|---|---|
| Workflow 代码 | Workflow.getVersion() 做兼容迁移(Temporal L1) |
| Agent 四维 | Activity 入参带 release_id(11-Registry) |
| Worker 部署 | Agent Worker 与 Temporal Worker 可同 Pod 可拆;拆则 gRPC 调 Agent 服务 |
3.2 失败模式
| ID | 现象 | 分工 |
|---|---|---|
RUN_99P_CRASH | 最后一步 OOM | Checkpoint 续跑步内;Workflow 不重放已完成 Activity |
RUN_99P_DUPLICATE_WRITE | 重试双写 | Activity 幂等键 + 业务去重表 |
RUN_RESUME_FULL_REPLAN | 恢复后计划漂移 | Checkpoint 存 plan[] 状态,禁止全量重规划(96 §4) |
ACTIVITY_TIMEOUT | LLM 太慢 | 调超时 / 环内降级小模型 |
3.3 观测
- Workflow:
workflow_id=order_id等业务键。 - Agent span:挂
parent_trace= Activity span。 - 统一
release_id进 08-可观测。
3.4 与 Camunda / Step Functions
| 引擎 | 何时口述 |
|---|---|
| Temporal | 云原生、代码即流程、强重试语义 |
| Camunda | 已有 BPMN 资产、业务分析师改图 |
| AWS Step Functions | 全 AWS、Agent 在 Lambda 内 |
Staff 原则:选已落地引擎,不为了面试换栈。
L4 · Staff 答辩
4.1 STAR-M-P:退款审批 3 天超时
| 要素 | 内容 |
|---|---|
| S | 退款需 L1/L2 审批,平均 2.8 天;纯 Redis session 丢状态 |
| T | 可审计、可恢复、不重复退款 |
| A | Temporal Workflow;runAgentPlan Activity 内 Spring AI;审批 Signal;executeRefund 幂等键 |
| M | 会话丢失因 无 durable workflow |
| P | 重复退款 0;审计 100% 关联 workflow_id |
4.2 大厂追问答
Q1 · 全用 LangGraph 行不行?
答:步内可以;跨天审批、定时器、多系统回调 应用 Workflow 引擎。否则自研调度 ≈ 重写 Temporal。
Q2 · Activity 里 LLM 调用 90s 怎么办?
答:startToCloseTimeout > P99;环内 streaming;超长则 拆 Activity 或异步回调 Pattern。
Q3 · Temporal 与 Kafka?
答:Kafka 事件通知;Temporal 状态机与重试。Agent 侧「任务完成」可发 Kafka,编排不交给 Kafka 消费组随意重试。
Q4 · Python Agent + Java Workflow?
答:常见:Java Temporal Worker + Python Agent gRPC Activity(见 05-python-agent §集成)。契约:protobuf + release_id。
Q5 · 何时用 Spring Statemachine 代替 Temporal?
答:单服务、无跨天、团队无 Temporal 运维 时 Statemachine 够用;多服务、审计、定时器 选 Temporal。
4.3 与 03 Supervisor 组合
| 模式 | Temporal | Supervisor |
|---|---|---|
| 跨服务退款审批 | Workflow 主 | Activity 内单次 runAgentPlan |
| 同 JVM 多 Worker 争用 | 不推荐 | EventBus + Supervisor |
| 定时催办 | Workflow Timer | — |
原则:Supervisor 不解跨天;跨天用 Workflow 等 Signal。
4.4 部署拓扑(白板)
flowchart LR
API[Spring Boot API] --> TW[Temporal Worker Pod]
TW --> TC[Temporal Cloud / Self-hosted]
TW --> AG[Agent Service]
AG --> LLM[LLM Gateway]
AG --> PG[(Checkpoint Postgres)]
- API 只
startWorkflow,不阻塞等 LLM。 - Agent Service 可独立扩缩;Activity 通过 gRPC 调用。
- Checkpoint 与 Workflow DB 分库——避免混表。
4.5 测试策略
| 层 | 测什么 |
|---|---|
| Workflow | Temporal Test Workflow Environment(时间跳跃) |
| Activity | Mock Agent;断言幂等键 |
| Agent | Golden trajectory(10) |
4.6 容量与 SLO
| 指标 | 建议 |
|---|---|
| Workflow 并发 | 按审批人数量与峰值单量估算;与 Agent GPU 分开扩容 |
| Activity 超时 | LLM P99 × 1.5 + tool 链 |
| History 保留 | 合规域 ≥1 年;与审计系统对接 |
| Worker 版本 | 与 release_id 联动;Workflow.getVersion 做兼容 |
4.7 常见追问速答
- Q:能否用 Kafka 代替 Temporal? — Kafka 传事件,不负责「等到周三经理批准」这类状态;会自研调度器。
- Q:Camunda BPMN? — 已有 BPMN 资产优先 Camunda;绿场 Java 云原生常用 Temporal。
- Q:Serverless? — Activity 调 Lambda 可行;长连接 LLM 仍建议专用 Agent 服务。
- Q:与 96 原型 G? — 批处理 G 用 Temporal;单会话 A/B 用 Agent checkpoint。
§8 决策速查表(面试翻牌)
| 症状 | 首选 |
|---|---|
| 用户等 3 天审批 | Temporal + Signal |
| 单会话 20 步工具环 | LangGraph checkpoint |
| 每晚批处理 10 万单 | Temporal + 队列 |
| 仅 JVM 内 2h 流程 | Spring Statemachine 03 |
| 跨服务补偿 | Temporal Saga |
§9 与 Registry / Eval 联动
Activity 入参必须带 release_id(11)。Workflow 升级用 Workflow.getVersion();禁止 Activity 内隐式读「最新 prompt」。
发布前:Golden 含 长流程 用例(审批超时、Signal 恢复)→ eval/golden 扩展。
§10 白板 45min 脚本
| 段 | 画/说 |
|---|---|
| 决策树 | §1.2 |
| 两平面 | Workflow History vs Checkpoint |
| 退款序列 | §2.3 Java 示意 |
| Signal HITL | §2.4 |
| STAR | §4.1 |
5. 面试前 Checklist
- 画 决策树:checkpoint vs Temporal
- 画 两平面:Workflow History vs Agent Checkpoint
- 述 Activity 四原则(幂等、粒度、超时、HITL Signal)
- 对比 LangGraph interrupt vs Temporal Signal
- 口述 STAR 退款审批
- 列 RUN_99P_* 与 Activity 重试关系
6. 导航
| 关联 | 路径 |
|---|---|
| Java 编排 | 03-Java-Agent编排 |
| LangGraph | 04-Agent框架 |
| Playbook 可靠性 | 13 §9.4 |
| Registry | 11-Registry |
| 参考架构 | 27 |
| 96 Catalog | 96 §2.5 RUN_* |
官方文档与源码(一级依据)
L1 · 官方文档
- Temporal — Documentation
- Temporal — Java SDK Develop
- LangGraph — Interrupts
- LangGraph — Persistence / Checkpoints
L2 · 官方源码