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 选型决策树
| 场景 | 推荐 | 反例 |
|---|---|---|
| 客服单轮 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 两平面模型
| 存储 | 内容 | 续跑问题 |
|---|---|---|
| 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 为准;以下为面试示意结构。
java
@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 部署拓扑(白板)
- 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 · 官方源码