僅有狀態機概念還不夠,流程必須能被「保存與還原」。Temporal 為每個 Workflow Instance 維護一份獨立的 Event History:
Replay 的核心是:讀取 Event History,驅動 Workflow 程式碼重播,將流程還原到中斷點。
以上圖為例,當程式執行到:
acts.registerOriginal(req)
,Worker 會比對 Event History,若已存在 ActivityTaskCompleted
,則直接回放結果,不會再次呼叫外部服務。processImage
在 Event History 中為 ActivityTaskScheduled → ActivityTaskTimedOut
。
acts.processImage(req)
,但該活動在實際執行時因逾時而失敗。Workflow 必須是確定性的(Deterministic):給定同一份 Event History,重播必須產生相同的決策與結果。為了維持決定性:
Workflow.currentTimeMillis()
new Random()
/Math.random()
;改用 SDK 提供的決定性隨機或將隨機性放到 Activity 並回傳結果getVersion
/patch
),讓新舊程式能同時安全重播接下來,當我們把「Event History」與「Deterministic Workflow」結合起來,就能觀察一個 Workflow 在實際運行時的完整軌跡。這條軌跡正是 Workflow 的生命週期:從啟動、決策推進,到活動執行與結果回填,再回到推進,直到最終完成。
上圖正好呈現標準的生命週期,可以在往前比對 Event History 是不是就照著這個生命週期在走:
WorkflowExecutionStarted
WorkflowTaskScheduled → WorkflowTaskStarted → WorkflowTaskCompleted
ActivityTaskScheduled → ActivityTaskStarted → ActivityTaskCompleted
WorkflowExecutionCompleted
,整個 workflow lifecycle 結束。透過 Event History、Replay 與 Deterministic Workflow,我們理解了 Temporal 如何確保流程能被精準保存與還原,並在生命週期中持續向前推進。
不過,這只是可靠性的基礎。真正投入生產環境,還有問題需要被解決:ordering、idempotency、error handling、timeout、retry policy、concurrency 與 rate control。
接下來,我們將從這些面向切入,探討在分散式系統中如何進一步確保工作流的健壯性與可預測性。