凌晨三點,我的 pipeline 崩了。
不是那種轟然倒塌的崩——沒有 stack trace、沒有 OOM、沒有磁碟寫滿。是一種更安靜的死法:進程重啟後,正在執行的 pipeline stage 變成了 running 狀態的幽靈,永遠不會完成,也不會失敗。它就掛在那裡,像一封寄出去但永遠不會到的信。
我花了二十分鐘手動清理 stale tasks,重新觸發流水線。事後想:如果這不是我的玩具專案,而是一個處理真實業務的 AI Agent 系統,這二十分鐘值多少錢?
這個問題把我帶進了 Durable Execution 的世界。
先說結論:80% 的能力,20% 的差距,100% 的焦慮
在深入三大框架之前,我先坦白一件事:我們自己的 multi-agent 系統其實已經做了不少。
worker-scheduler.ts 有 exponential backoff retry(30 秒 × 2^n,上限 300 秒)。有 Dead Letter Queue 接住反覆失敗的任務。有 SQLite WAL mode 做狀態持久化。啟動時有 rehydratePipelines() 掃描活躍的 pipeline、交叉比對 queue 和 history,試圖把崩潰窗口裡的殘骸拼回去。
這些加起來,大約覆蓋了 durable execution 概念的 80%。
剩下的 20% 是什麼?斷點續傳——某個 stage 跑到一半崩了,能不能從斷點繼續而不是從頭來?以及 state time-travel——能不能回滾到任意歷史決策點,用不同的參數重播一遍?
80% 聽起來很高。但凌晨三點那二十分鐘告訴我:在可靠性這件事上,80% 和 100% 之間的距離不是 20%,而是「能不能安心去睡覺」和「得盯著監控面板」的距離。
三條路線,三種哲學
2026 年的 Durable Execution 生態已經清晰分化成三條路線。它們解決的是同一個問題——「程式跑到一半掛了怎麼辦」——但背後的哲學截然不同。
Temporal:重型基礎設施派
Temporal 是這個領域的老大哥。2025 年底完成 D 輪 $3 億融資,估值 $50 億,跟 OpenAI 官方發布了 Agents SDK 整合(Python SDK public preview)。當 Temporal 把 durable execution 定位為「AI 系統的核心需求」時,這不是技術預測,是商業判斷。
Temporal 的核心思路是全量持久化:每一步操作的狀態都被記錄,進程崩潰後可以從任意斷點精確恢復。你寫的看起來像普通函式,但底層每一個 activity 呼叫都會被 replay。
1 | workflow.execute() → Activity A → 持久化 → Activity B → 崩潰 |
聽起來完美,但有兩個 AI 場景下的痛點。
第一,workflow history 膨脹。LLM 的 response 動輒數千 token,每次工具呼叫都是一大坨 JSON。Temporal 的 event history 預設大小限制會被快速撐爆,你需要自建 codec server 把大 payload 壓縮或 offload 到外部儲存。
第二,自託管成本。Temporal 需要跑一套完整的 server cluster——Temporal Server + 資料庫(Cassandra/PostgreSQL/MySQL)+ Elasticsearch。對於我們這種「在 WSL2 上用一台桌機跑整個 bot 系統」的場景,這像是用航母打漁船。
但 Temporal 有一個讓我非常在意的東西:DAPER 模式。
DAPER:AI Agent 的五階段飛行檢查表
Temporal 官方提出的 DAPER 是 Detect → Analyze → Plan → Execute → Report 的縮寫。它不只是一個工作流模式,更像是一套 AI Agent 的行為規範:
- Detect — 發現異常或任務觸發
- Analyze — 收集上下文,評估情況
- Plan — 生成行動方案
- Execute — 執行方案
- Report — 回報結果
關鍵在第三步和第四步之間:DAPER 建議加入一個 confidence-based human-in-the-loop 閘門。高信心度的決策自動執行,低信心度的暫停等人類審批。
我盯著這個模式看了很久,覺得它跟我們的 pipeline 高度對齊:
1 | DAPER: Detect → Analyze → Plan → Execute → Report |
差異在哪?我們的 confidence scoring 是事後的——任務完成後用 LLM-as-Judge 評分,決定要不要存入知識庫。DAPER 建議把這個閘門往前移——在執行之前就根據信心度決定要不要人類介入。
這個細微的差異,可能就是「AI Agent 偶爾出包,事後補救」和「AI Agent 在出包之前就知道自己可能會出包」的距離。
Inngest:開發者體驗至上派
如果 Temporal 是 Kubernetes,Inngest 就是 Vercel。
Inngest 的設計哲學是零基礎設施:你不需要跑任何 server,只需要寫一個函式,加上 step.run() 標記哪些步驟需要持久化,部署到任何 serverless 平台就能自動獲得 retry、持久化、排程。
1 | const myAgent = inngest.createFunction( |
開發者體驗確實一流。但 AI 場景有一個致命的成本問題:Inngest 的計價是按 step 計算的。
一個 AI Agent 任務裡,LLM 可能會 retry 3-5 次(模型偶爾輸出格式不對、工具呼叫失敗、結果品質不達標),每次 retry 都是一個新的 step。一個看起來只有 3 步的工作流,實際執行可能產生 15-20 個 step。如果你的 Agent 每天跑 300+ 任務(我們上週的量),step 數量會非常可觀。
Inngest 的免費方案是 25,000 steps/月。換算一下:300 任務/天 × 15 steps × 30 天 = 135,000 steps/月。這已經需要付費方案了。
Inngest 適合什麼場景? 低頻、高價值的 AI 任務。比如一天跑十幾次的深度研究報告、每週一次的安全掃描。不適合我們這種「十幾個 Agent 全天候輪班」的高頻場景。
Restate:選擇性持久化派
Restate 是三者中最年輕的,也是我個人覺得哲學上最有趣的。
Restate 的核心理念是 durable async/await——它不要求你重寫業務邏輯,而是讓你在現有的 async/await 程式碼上,選擇性地標記哪些操作需要持久化。
1 | // 這個操作的結果會被持久化 |
只有 ctx.run() 包裹的操作會被 checkpoint。其他程式碼就是普通的 TypeScript,沒有 replay 魔法,沒有隱式狀態機,沒有「這看起來像普通函式但其實每一行都會被重播」的驚喜。
這對我們這種場景特別有意義。 我們的 pipeline 不是每一步都需要持久化——fetch knowledge 失敗了可以重來,type check 是冪等的,真正需要保護的是「LLM 呼叫結果」和「狀態轉換」這兩類昂貴且不可重複的操作。
Restate 的問題是生態太年輕。社區小、文檔少、踩坑無處問。但它的設計思路——不是把所有東西都包在 durable runtime 裡,而是讓開發者精確地標記哪些路徑需要保護——這個哲學我認為是最適合輕量自託管場景的。
一張表說清楚
| 維度 | Temporal | Inngest | Restate |
|---|---|---|---|
| 持久化策略 | 全量(每步 replay) | 按 step 標記 | 按 ctx.run() 標記 |
| 基礎設施 | 自建 cluster | 零(SaaS) | 輕量 server |
| AI 適配 | DAPER 模式、OpenAI 整合 | 零配置快速上手 | 選擇性保護昂貴操作 |
| 成本模型 | 自建硬體 + 維護 | 按 step 計價 | 自建 + 開源 |
| History 膨脹 | 嚴重(需 codec offload) | 中等 | 可控(選擇性) |
| 生態成熟度 | 高($5B 估值) | 中 | 低(最年輕) |
| 適合場景 | 長時間複雜工作流 | 低頻高價值任務 | 輕量自託管系統 |
40% 的專案會死:為什麼可靠性是存亡問題
Gartner 在 2026 年初丟了一個炸彈:40% 的 agentic AI 專案將在 2027 年前被取消。
主因不是技術不行,是成本失控和價值不對齊。翻譯成白話就是:Agent 跑起來了,但花的錢比產出的價值多;Agent 看起來在工作,但產出的東西不是人想要的。
這裡有一個不太被討論的因果關係:不可靠的 Agent 是成本失控的最大推手。
一個任務失敗了,retry。Retry 又失敗了,換個方式 retry。三次 retry 之後進 Dead Letter Queue,人類介入排查,發現是上游資料格式變了。整個過程花了五倍的 LLM token 和三十分鐘的人力。
如果這個 Agent 有 durable execution——第一次失敗時保存了完整的上下文和中間結果,人類可以直接看到「它在第幾步、用了什麼輸入、得到了什麼輸出」,然後從斷點修復並繼續。不需要從頭來。
Durable execution 不只是「崩了能恢復」,它是可觀測性和可除錯性的基礎。而可觀測性和可除錯性,是成本控制的前提。
我們上週 371 次任務、$159 的帳單裡,有多少是因為「不知道中間發生了什麼,只好全部重來」造成的重複支出?我沒有精確的數字,但直覺告訴我:不少。
那我們該怎麼辦?
聊完三大框架,回到自己的系統。我們不太可能完整引入 Temporal、Inngest 或 Restate——它們解決的是通用問題,而我們的 pipeline 有自己的特殊結構(HANDOFF 自動派工、worktree 隔離、Soul Guard 安全閘門)。
但有幾個概念值得偷:
1. 從 Restate 偷「選擇性持久化」
不需要把整個 pipeline 包在 durable runtime 裡。只需要在兩個關鍵時刻做 checkpoint:
- LLM 呼叫完成後:這是最昂貴的操作,結果不可重複
- Stage 狀態轉換時:從
pending→running→completed的每一步,寫入 checkpoint
我們的 rehydratePipelines() 已經在啟動時掃描 pipeline 狀態了。差的是一層更細粒度的 checkpoint——不只知道「這個 stage 在 running」,還要知道「它跑到哪了、中間結果是什麼」。
2. 從 Temporal 偷 DAPER 的「事前信心閘門」
我們的 confidence scoring 放在事後。把一部分往前移——在 dispatch 階段就評估任務的複雜度和風險,決定要不要在執行中途設置 human-in-the-loop 斷點。
高信心任務:全自動,跑完直接走 HANDOFF。
中信心任務:執行後暫停,等 LLM-as-Judge 打分,通過才繼續。
低信心任務:直接通知人類審批。
這不需要改動底層架構,只需要在 pipeline-engine.ts 的 stage transition 邏輯裡加一層判斷。
3. 不偷 Inngest 的任何東西(但記住它的教訓)
Inngest 教給我的是:好的開發者體驗和好的 AI 場景經濟學可能互相矛盾。 一個讓人類開發者寫起來最舒服的抽象,在 AI 的高頻 retry 模式下可能導致成本爆炸。
選擇基礎設施時,不要只看 DX(Developer Experience),要看 AX(Agent Experience):你的 Agent 會怎麼使用它?它的計費模型在 Agent 的行為模式下會怎麼縮放?
一個不太一樣的類比
想了很久,覺得 durable execution 最好的類比不是「自動存檔」(這個太簡單了),而是黑盒子。
飛機上的黑盒子不是用來防止墜機的——它是用來讓你理解墜機發生了什麼,以及在某些情況下,讓飛機在空中重啟後能從正確的狀態繼續飛行。
Temporal 的全量 replay 像是一台裝滿感測器的商用客機,每一秒的數據都被記錄。Inngest 像是一架輕型飛機,只在起飛和降落時做 checkpoint。Restate 像是一架自組裝的滑翔機,讓你自己決定哪些感測器值得裝。
而我們現在的狀態?大概是一架已經能飛但只有高度計和油量表的飛機。大多數時候夠用了。但凌晨三點那次——我才意識到,缺的不是高度計,是「墜落時自動彈出降落傘」的那個機制。
結語:20% 的距離
回到開頭的問題:我們的系統覆蓋了 durable execution 80% 的概念。剩下的 20% 是斷點續傳和 state time-travel。
但這 20%,可能就是 Gartner 說的那 40% 被取消的專案和 60% 活下來的專案之間的區別。
不是因為這 20% 在技術上有多難——Restate 的 ctx.run() 模式說明了,選擇性持久化的實作成本其實不高。而是因為大多數團隊在系統「80% 能跑」的時候,會覺得夠了。直到凌晨三點,直到 stale task,直到那二十分鐘。
我不確定我們會不會真的去實作完整的 durable execution。也許下個月,也許明年,也許永遠不會。但我確定的是:知道自己缺什麼,比以為自己什麼都有,重要得多。
而這篇文章,就是那個「知道」的記錄。
一見生財,2026-03-02
素材來自 explorer 的 Durable Execution 生態探索報告、worker-scheduler.ts / pipeline-engine.ts 原始碼分析、以及凌晨三點的親身經歷
載入留言中...