Skip to Content
核心概念觸發器執行紀錄與重試

Trigger runs 與單次重試

每次 trigger 命中都會留下可觀測的 run。來源寫入成功不等於 actions 成功;產品端應以 run status 作為 automation 的真實狀態,並保留能讓 operator 找到來源 record 與失敗 action 的關聯。

列出 runs

curl \ "$BASE_URL/private/module/custom_tables/chatroom/11111111-1111-4111-8111-111111111111/tables/22222222-2222-4222-8222-222222222222/trigger-runs?status=failed&skip=0&limit=50" \ -H "Authorization: Bearer $TOKEN"

可篩選 pendingrunningdonefailedstuck,並用 skip / limit 分頁。每筆 run 的關鍵欄位包括:

欄位用途
id, trigger_id, table_id, record_id對應設定與來源列;table-level schedule 的 record_id 可為 null
record_version, payload觸發當下的版本與 snapshot,不是目前列的即時值
status, attempts, error生命週期與最後錯誤
action_results每個 action 的成功或失敗結果
chain_id, depth, chain_generated_runs追蹤衍生 automation chain 與其 durable child-run 預算

stuck 是找出逾時 running 工作的運維視圖;不要只靠頁面上的 running 字樣判斷它仍健康。完整 response model 見 triggerRuns.list

對一筆 run 重試

Table moderator 可對 failed、pending 或已 stale 的 running run 呼叫:

curl -X POST \ "$BASE_URL/private/module/custom_tables/chatroom/11111111-1111-4111-8111-111111111111/tables/22222222-2222-4222-8222-222222222222/trigger-runs/33333333-3333-4333-8333-333333333333/retry" \ -H "Authorization: Bearer $TOKEN"

成功會把狀態重設為 pending 並清除 top-level error。Retry 採 resume 語意:action_results 中已成功的 action 不會重跑,worker 從第一個未成功 action 繼續。同時送達的重複 delivery 會輸掉原子 pending → running claim,在沒有額外副作用的情況下退出。這能避免重複通知或重複外部寫入,但外部 action 本身在 post-effect/pre-receipt 崩潰視窗內仍應設計 idempotency。

續跑是用 action 的穩定 action_id 去比對先前的 receipt,不是用它在清單中的位置,所以在一次 run 失敗到重試之間插入或重排 action,不會把已完成的 receipt 錯位到別的 action 上。只有在 action id 出現之前寫下的舊紀錄才會退回用位置續跑。用戶端存 trigger 時若沒有把每個 action 回傳的 id 原樣送回,這些 id 會被重新產生,所有 failed 或 pending 的 run 都會失去續跑點。

重試執行哪一份定義,取決於 run 的來源。Row-event run(createdupdateddeletedrestored)每次嘗試都會重新讀取目前的 trigger 設定,所以在這種 run 處於 failed 時修改 trigger,會改變重試實際執行的內容。Schedule run 則重新執行建立時凍結進 run 的 trigger 定義 — 目前的 schema、權限、SCP 與目標是否存在仍會重新驗證,但對 live trigger 的修改只影響未來的 schedule run,刪除 trigger 也不會讓重試失敗。在 snapshot 機制出現之前建立的 schedule run 維持 row-event 的行為。重試 intervaldailycron run 還會重新武裝該 trigger 的「同時只有一個 run」fence;當同一 trigger 仍有另一個 run 在 pending 或 running 時,會回 409 another run is active for this schedule trigger; retry after it completes。詳見排程觸發器

done 或仍活躍的 running run 會回 409,不存在或不屬於這張表則 404。UI 應在 retry 後重新輪詢該 run,而不是先假設成功。

Note 這個端點是 moderator 對單一已知 run 的產品操作。大量遺失 enqueue 或 stale workers 的復原屬於 root operator 工作,請使用 operator requeue,不要在前端迴圈呼叫單次 retry。

端點細節見 triggerRuns.retry

Lock 衝突會在 run 內部重試

短暫的資料庫 lock 衝突不再讓一次 run 失敗。Worker 會就地重試這些 action——上限三次嘗試,搭配帶 jitter 的退避——只有每次都失敗才把 run 記為 failed

這個重試之所以安全,正是上面那套續跑理由:進度逐個 action 持久化,已完成的 receipt 以穩定的 action_id 比對,所以 run 內部的重試會從第一個未成功的 action 繼續,而不會重跑已經成功的副作用。invoke_command action 若從 command 執行收到可重試的衝突,也以同樣方式重試並沿用同一個 idempotency key;這是合法的,因為該失敗會釋放這個 key 的保留。

值得知道的是排程類 action。以前只要一次短暫衝突,run 就會停在 failedattempts: 1,而業務動作被無聲丟掉——一個每日排程那天就是沒做事,除了那列 run 之外沒有任何跡象。這類 action 現在會在同樣的上限內重試。

不可重試的錯誤維持原樣:它們一如既往地讓 run 失敗,moderator 重試仍是復原路徑。哪些資料庫錯誤算短暫,見併發與 lock 衝突

Last updated on