首页 › ai-agents › Agent持久化执行六栈实测

Agent持久化执行六栈实测:从checkpoint到事件溯源的崩点续跑全账

概述

跑通一个Demo,Agent能在第3步漂亮地调用工具;推到生产,它死在第7步。2026年横扫业界的判断很残酷——企业级AI Agent部署有近七成在上线第一年内宣告失败,而崩点几乎清一色落在多步工作流的"中段":一次外部API抖动、一次容器滚动更新、一次人在回路审批的8小时延迟。这把行业的注意力从"哪个框架更易上手"硬生生拽到了一个更底层的问题上:Agent的执行能不能像数据库事务一样,崩了之后从断点无损续跑、且不重复副作用。这就是"持久化执行(Durable Execution)"成为2026年Agent可靠性核心命题的原因。

本文不重复框架横评,而是把六栈放到同一台"崩溃测试台"上:LangGraph的节点checkpoint、Temporal的事件溯源、Restate的日志化函数、DBOS的Postgres事务、OpenAI Agents SDK的Session记忆、CrewAI Flows的结构化state。我们只问三件事:崩溃后能否从精确断点续跑?续跑时会不会重复扣款/重复发信?人审中断8小时后能否无缝恢复?

六栈持久化执行能力对照表

栈 持久化范式 最小续跑粒度 续跑副作用安全 人审中断续跑 时间旅行 侵入度 生产成熟度
LangGraph 节点Checkpoint 超步(节点) 需手动保证幂等 原生interrupt 原生fork/get_history 中 高
Temporal 事件溯源重放 Activity 确定性重放保证 Signal+Timer 历史查询(非fork) 高 极高
Restate 日志化Journal run()调用 自动replay Awakeable 有限 低 中(新锐)
DBOS PG事务Checkpoint step() 自动(基于PG) 外置Timer 有限 低 中
OpenAI Agents SDK Session记忆 会话Turn 无执行边界保证 手动 无 极低 中
CrewAI Flows 结构化State Flow Step 弱 有限 无 低 中

一句话读懂这张表:只有Temporal和Restate/DBOS把"重放安全"做进了运行时;LangGraph把能力交给你,OpenAI Agents SDK和CrewAI则根本不在这一层。下面逐栈拆解。


一、两大范式之争:Checkpoint快照 vs 事件溯源重放

在比较具体框架之前,必须先看透底层只有两种范式,它们决定了续跑时副作用的命运。

Checkpoint快照式(LangGraph、DBOS为代表)的思路是"定期存盘":每个执行边界(节点/步骤)完成后,把当前完整状态序列化写盘。崩溃后从最近快照恢复,继续往后跑。优点直观、实现轻;致命弱点在于——快照只能告诉你"走到哪了",不能告诉你"已经对外做过什么"。如果你的第5步已经扣了款但快照还没落,崩溃重试就会重复扣款;如果快照已落但下游邮件系统实际没收到,续跑又会跳过这封邮件。一句话:checkpoint存的是"状态",不是"已发生的副作用契约"。

事件溯源重放式(Temporal、Restate为代表)的思路截然相反——"记下每一步发生了什么"。它把每次外部调用(Activity/run())的结果作为事件追加进一条不可变日志。崩溃后,引擎重放这条日志:对已记录结果的事件直接返回缓存值,绝不真正重新执行;只有未完成的步骤才会真正执行。这就天然保证了"已扣款的绝不重扣"。

# Temporal:重放语义——同一个charge在崩溃重试时不会被二次执行
@workflow.defn
class OrderWorkflow:
    @workflow.run
    async def run(self, order):
        await workflow.execute_activity(charge, order)   # 已记录→重放跳过
        await workflow.execute_activity(send_email, order) # 未完成→真正执行

理解了这条分水岭,后面六栈的差异就只是这两条路的工程化程度不同。变现角度看,这套"重放安全"心智模型是当前最高溢价的训练营主题——因为它直接对应企业最痛的"扣错款/发错信"事故,能把一节通用框架课从199元卖到1990元的客单。


二、LangGraph:把持久化能力交给你,但不替你背书

LangGraph是六栈里把"持久化"做到最细粒度的Agent框架。它的核心抽象是thread_id+checkpointer:图每执行完一个节点(一个"超步"),就把整张图的状态序列化进checkpointer。崩溃后用同一个thread_id重新invoke(None),就从断点续跑。

from langgraph.checkpoint.postgres import PostgresSaver
graph = builder.compile(checkpointer=PostgresSaver(...))
cfg = {"configurable": {"thread_id": "order-7"}}
graph.invoke(None, config=cfg)   # 崩溃恢复:从最近checkpoint续跑

它还有六栈里最强的时间旅行能力:get_state_history能倒查每一步的历史状态,update_state能从任意历史节点fork出一条新分支重跑——调试"到底哪一步把状态带歪了"时几乎是神器。HITL也是原生的:节点上挂个interrupt(),流程挂起等人审,几小时后恢复继续。

但LangGraph的软肋正是范式带来的:它默认你是个清醒的工程师。checkpoint存的是图状态,工具调用是否幂等、外部副作用是否可重放,全部是你自己的事。官方文档点破:LangGraph的"durable"程度取决于你怎么建模task、side effect和thread identity。一个没做幂等的扣款工具,在崩溃重试时照样会重复执行——框架不会拦你。所以LangGraph是"能力完备但责任自负",适合有能力自己设计幂等契约的团队,而不是开箱即用的兜底。


三、Temporal:把重放安全写进引擎,代价是与LLM的非确定性硬碰硬

如果"绝不重复副作用"是红线,Temporal是六栈里唯一能把这话写进契约的引擎。它来自Uber的十年生产打磨,核心是事件历史+确定性重放:工作流函数本身必须是纯函数(不能用墙钟、不能直接调外部),所有副作用必须包成Activity。崩溃恢复时引擎重放事件历史,对已完成的Activity直接返回记录值。

@workflow.defn
class OrderWorkflow:
    @workflow.run
    async def run(self, order):
        await workflow.execute_activity(charge, order, 
            start_to_close_timeout=timedelta(seconds=10),
            retry_policy=RetryPolicy(maximum_attempts=5))
        # charge完成后崩溃→重放时跳过,绝不二次扣款

它的生产成熟度是六栈天花板:支持跨进程跨机器恢复、长任务可以跑几天甚至几周、Signal机制让长流程里的人审和外部回调都能无缝嵌入。但代价同样高昂——确定性约束与LLM的天生非确定性正面冲突。LLM的输出不可复现,而Temporal要求重放时工作流逻辑必须产生完全相同的调用序列。实践中必须把"调用LLM"整体包进Activity(让它的输出成为不可变事件,而非可变逻辑),这本身需要一套设计纪律,新手极容易踩坑。结论:要企业级durability、要扛住金融级副作用,Temporal是终点;但要为陡峭的学习曲线和确定性心买单。


四、Restate:代码即持久化的新锐,低侵入是杀手锏

Restate代表2026年最值得关注的工程方向——把持久化执行做成"几乎零侵入"的代码注解。你写一个普通函数,用ctx.run("name", fn)标记每一步,Restate自动给它套上journaling:每步结果写入日志,崩溃重放时自动跳过已完成步骤。它不要求函数确定性(重放靠日志而非重算),也不要求你重写架构——函数照样能被当作HTTP/gRPC服务调用。

@restate.service
export default {
  async process(ctx: restate.Context, order) {
    const charged = await ctx.run("charge", () => charge(order));   // journaled
    await ctx.run("email",   () => sendEmail(order));                // journaled
    // 崩溃重放:两步若已完成→直接返回缓存,绝不重发
  }
}

它还内置Awakeable原语:可以让流程挂起,等一个未来的外部回调(人审、第三方webhook)把结果推回来再继续,且这整段挂起是durably持久化的,重启不丢。相比Temporal,Restate的侵入度低一个量级、上手快、TS/JS原生,特别契合前端全栈团队给Agent加"崩溃兜底"。短板是生态新、生产案例还在积累、多语言支持不如Temporal广。但就"最小代价给Agent装上事件溯源"这件事,Restate是2026年性价比最高的赌注。


五、OpenAI Agents SDK + DBOS:会话记忆到执行持久化的拼图

OpenAI Agents SDK本身只提供Session级记忆——内置保存对话历史,跨turn保持上下文,省去手动拼to_input_list()。这解决的是"上下文连续",不是"执行续跑"。SDK对"崩溃后从第7步续跑、不重复副作用"没有原生承诺,Session也只是消息列表的持久化。

# SDK原生:只是会话记忆,崩溃续跑不保证
result = await Runner.run(agent, "处理订单", 
    session=session)  # 存的是对话历史,非执行边界

要补上"执行持久化"这块,2026年的标准答案是外挂DBOS——一个把Postgres当唯一真相源的轻量持久化执行引擎。DBOS官方直接给了OpenAI Agents SDK的集成:用@dbos.workflow()包住Agent主流程,用@dbos.step()标记副作用步骤,崩溃后基于PG事务日志自动续跑、跳过已完成步骤。

@dbos.workflow()
def run_agent(self, prompt):
    draft = dbos.step(lambda: Agent().run(prompt))   # durably journaled
    dbos.step(lambda: send_email(draft))             # 崩溃重放跳过
    return draft

这个组合的价值在于:你保留了SDK"上手极简"的开发体验,又用DBOS拿到了Temporal级别的执行可靠性,且全程只用一个Postgres、事务一致性天然成立。适合"已经用OpenAI Agents SDK写好了Demo、现在要上生产"的团队做最小改造。变现上,"把SDK原型改造成生产级Agent"是当下咨询市场的高频付费需求。


六、CrewAI Flows:结构化State很顺手,但replay是软肋

CrewAI的Flows把多Agent编排做成了声明式管线,FlowState是一个你自定义的结构化对象,在.and_then()串联的步骤间流转并持久化。这给多Agent协作场景提供了清晰的状态骨架——每个step拿到上游state、产出新state,整体可序列化落库。

class OrderState(FlowState):
    items: list
    total: float
flow = (Flow(start=fetch)
        .and_then(checkout)
        .and_then(ship))
flow.kickoff(inputs={"items": [...]})  # state在步骤间持久化

但CrewAI的持久化停留在"存一个state对象"的粒度,缺乏事件溯源式的重放保证。崩溃续跑时,它恢复state继续往后跑,可如果第3步的checkout已经发了外部请求,续跑可能既漏掉又重复,取决于你自己在step里写的幂等逻辑——框架不兜底。时间旅行、细粒度replay这些能力基本缺席。结论:CrewAI Flows在"多Agent编排的顺手程度"上很强,但在"执行可靠性"这个维度上是六栈里最薄的,适合短链路、对副作用重复容忍度高的场景,长程生产链路要慎选。


七、选型红线:replay边界与幂等三问

抛开品牌,落到工程决策,所有选型都收敛到三个问题,建议在动工前先回答:

  1. 续跑时会不会重复外部副作用? 若你的链路含扣款、发信、下单这类不可逆操作,必须选事件溯源系(Temporal/Restate)或自己严格做幂等。Checkpoint系(LangGraph)和Session系(SDK/CrewAI)默认不兜底。
  2. 人审中断能撑多久? 若流程需要在"等用户8小时审批"期间安全挂起,Temporal的Signal/Timer、Restate的Awakeable是原生解;LangGraph的interrupt够用;SDK/CrewAI需自建。
  3. 崩溃点有多深? 若链路只有3步、每步<30秒,Session记忆+简单重试就够,别上重型引擎;若动辄几十步、跨数小时,没有事件溯源就是赌命。

六栈持久化执行工作流架构

flowchart TB
    Req[Agent请求 / order-7] --> RT{执行运行时}

    subgraph CP[Checkpoint快照范式]
        direction TB
        LG[LangGraph 节点checkpoint]
        DB[DBOS PG事务step]
        LG & DB -->|存:完整状态快照| Snap[(状态快照库)]
    end

    subgraph ES[事件溯源重放范式]
        direction TB
        TP[Temporal Activity]
        RS[Restate ctx.run]
        TP & RS -->|追加:不可变事件| Log[(事件日志)]
    end

    subgraph MEM[记忆范式 - 非执行边界]
        SDK[OpenAI Agents SDK Session]
        CR[CrewAI Flows State]
        SDK & CR -->|存:对话/状态对象| Sess[(会话库)]
    end

    RT --> CP
    RT --> ES
    RT --> MEM

    Snap --> Crash{崩溃恢复}
    Log --> Crash
    Sess --> Crash

    Crash -->|续跑:可能重复副作用⚠️| CP
    Crash -->|重放:跳过已完成步骤✅| ES
    Crash -->|仅恢复上下文,不保证续跑| MEM

    Crash --> Side[外部副作用<br/>扣款/发信/下单]
    Side -.重放安全.->|绝不重复| ES
    Side -.需自保幂等.-> CP
    Side -.不兜底.-> MEM

推荐方案

一句话收尾:2026年Agent框架的胜负手,已经从"谁更易上手"转移到了"谁的执行能扛住崩溃"。持久化执行不是框架的附加题,而是Agent从Demo走进生产的最后一公里工程。

参考来源

  1. Durable Execution for AI Agent Runtimes: Checkpointing, Replay, and Recovery — Zylos Research — 持久化执行作为Agent可靠性核心层的范式定义与收敛方向
  2. Temporal vs LangGraph (2026): Durable Agent Architecture — Cordum — "失败发生在第7步而非Demo",checkpoint与事件溯源在Agent架构上的对垒
  3. LangGraph vs OpenAI Agents SDK vs PydanticAI (2026) — Open TechStack — 三框架持久化、handoff、MCP与评估能力的实战对比
  4. Mastering Flow State Management — CrewAI Docs — CrewAI Flows结构化state的持久化与流转机制
  5. Sessions: Built-in Session Memory — OpenAI Agents SDK 与 OpenAI Agents SDK | DBOS Docs — SDK会话记忆机制与DBOS执行持久化集成方案

[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。

51学通信知识星球海报-扫码加入