行追蹤器詳解:并發(fā)exec狀態(tài)跟蹤的完整設(shè)計(jì)指南)
Cloudflare Computer執(zhí)行追蹤器詳解并發(fā)exec狀態(tài)跟蹤的完整設(shè)計(jì)指南【免費(fèi)下載鏈接】computerGive your agent a computer 項(xiàng)目地址: https://gitcode.com/GitHub_Trending/computer1/computerCloudflare Computer 是一個(gè)為 AI Agent 提供一臺(tái)計(jì)算機(jī)的開源項(xiàng)目Give your agent a computer 它把虛擬文件系統(tǒng)和可插拔的執(zhí)行后端封裝在 Durable Object 中。當(dāng)多個(gè)exec命令同時(shí)在不同后端容器、Worker Shell、Worker JavaScript上并發(fā)運(yùn)行時(shí)系統(tǒng)如何準(zhǔn)確跟蹤每個(gè)執(zhí)行execution屬于哪個(gè)運(yùn)行時(shí)runtime答案就是ExecutionRuntimeTracker執(zhí)行追蹤器——本文帶你用最短的時(shí)間理解它的狀態(tài)跟蹤設(shè)計(jì)。Cloudflare Computer 的整體架構(gòu)Durable Object 持有權(quán)威狀態(tài)執(zhí)行面可插拔為什么并發(fā) exec 需要執(zhí)行追蹤器一個(gè) Workspace 可以同時(shí)注冊多個(gè)后端workspace.runtime.exec()是唯一的執(zhí)行入口。每條命令執(zhí)行后系統(tǒng)會(huì)拿到一個(gè)executionId后端容器可能隨時(shí)被替換reconnect、重建。這時(shí)候有兩個(gè)經(jīng)典問題后續(xù)操作該發(fā)給誰對某條 exec 執(zhí)行killExec、disposeExec、拉取事件流getExec時(shí)必須確認(rèn)它當(dāng)前所在的運(yùn)行時(shí)運(yùn)行時(shí)被換了怎么辦如果容器已重建舊 exec 已經(jīng)丟失系統(tǒng)要快速、明確地報(bào)錯(cuò)而不是把命令發(fā)到錯(cuò)誤的運(yùn)行時(shí)上。執(zhí)行追蹤器就是為這兩個(gè)問題設(shè)計(jì)的記錄最近活躍的執(zhí)行 → 所屬運(yùn)行時(shí)的映射關(guān)系。雙層結(jié)構(gòu)有界內(nèi)存 LRU SQLite 持久化追蹤器的核心實(shí)現(xiàn)非??酥浦挥?100 行左右位于 execution-runtime-tracker.ts。層級(jí)實(shí)現(xiàn)作用內(nèi)存層Map實(shí)現(xiàn)的有界 LRU默認(rèn)1024條快速命中避免無界增長持久層SqlExecutionRuntimeStoreSQLite 表computer_execution_runtimeDurable Object 重啟/緩存淘汰后恢復(fù)所有權(quán)幾個(gè)關(guān)鍵設(shè)計(jì)點(diǎn)LRU 淘汰#touch()方法在讀取時(shí)把條目重新插入到 Map 末尾利用 Map 的插入順序把最久未訪問的鍵淘汰——最近活躍的執(zhí)行永遠(yuǎn)不會(huì)先被擠出去持久兜底內(nèi)存命中不了時(shí)回查 SQLite查到的映射會(huì)被回填進(jìn)內(nèi)存緩存樂觀刪除delete(key, expectedRuntimeId)只有當(dāng)前值與期望的 runtimeId 一致時(shí)才真正刪除防止并發(fā)場景下晚到的舊操作誤刪新執(zhí)行剛寫入的映射。Workspace 構(gòu)造時(shí)這樣裝配追蹤器見 workspace.tsthis.#executionRuntimes new ExecutionRuntimeTracker( 1_024, new SqlExecutionRuntimeStore(this.#db), );一次并發(fā) exec 的完整狀態(tài)跟蹤流程整個(gè)閉環(huán)體現(xiàn)在 workspace.ts 的命令適配層中流程大致是exec 返回時(shí)記憶每條命令的返回信封envelope自帶runtimeId通過#rememberExecutionRuntime()寫入追蹤器鍵由JSON.stringify([backendId, executionId])組合天然區(qū)分不同后端下的同號(hào)執(zhí)行 ID后續(xù)操作前查表getExec/killExec/disposeExec先查追蹤器拿到期望的 runtimeId斷言校驗(yàn)真正下發(fā)前assertExecutionRuntime()會(huì)把期望值與當(dāng)前運(yùn)行時(shí)對比。若容器已被替換立即拋出WorkspaceExecutionLostError錯(cuò)誤碼EEXEC_LOST明確告知這條執(zhí)行在運(yùn)行時(shí)替換時(shí)丟失了清理收尾disposeExec成功后用帶期望值的樂觀刪除清理映射避免臟數(shù)據(jù)殘留。這樣即使緩存被淘汰、甚至 Durable Object 整體重建新的 Workspace incarnation持久層也能把誰屬于哪個(gè)運(yùn)行時(shí)的信息恢復(fù)回來——測試用例 execution-runtime-tracker.test.ts 覆蓋了 LRU 淘汰、持久回退、跨實(shí)例恢復(fù)和樂觀刪除全部場景。設(shè)計(jì)亮點(diǎn)小結(jié)?有界內(nèi)存LRU 上限固定緩存占用不隨 Durable Object 生命周期無限增長?持久兜底SQLite 保證跨實(shí)例incarnation的所有權(quán)連續(xù)性?失敗即明確運(yùn)行時(shí)不匹配時(shí)報(bào)EEXEC_LOST而不是靜默執(zhí)行到錯(cuò)誤環(huán)境?并發(fā)安全樂觀刪除 鍵中攜帶后端 ID雙保險(xiǎn)防并發(fā)誤操作。相關(guān)資料追蹤器實(shí)現(xiàn)packages/computer/src/execution-runtime-tracker.tsWorkspace 集成packages/computer/src/workspace.ts行為測試packages/computer/src/execution-runtime-tracker.test.ts運(yùn)行時(shí)接口規(guī)范docs/05_runtime_interface.md同步協(xié)議含并發(fā)變更說明docs/02_sync_protocol.md可運(yùn)行示例examples/container、examples/worker-shell【免費(fèi)下載鏈接】computerGive your agent a computer 項(xiàng)目地址: https://gitcode.com/GitHub_Trending/computer1/computer創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考