在分散式流程中,網路延遲、第三方不穩與長任務不可避免,Timeout 與 Retry 的規則設定是推進及修復流程的一大重點。
本篇首先介紹 Timeout Policy,提供可落地的設定方法,避免單次執行無限等待、釋放被占用的執行緒,並為下一篇的 Retry Policy 奠定基礎。
類型 | 作用 | 典型場景 | 設定建議 |
---|---|---|---|
Start-to-Close | 限制單次 Activity 執行時間 | 呼叫外部 API、單步 DB 操作 | 依 P95~P99 Latency ×2~3 倍 |
Schedule-to-Start | 限制排隊等待時間 | 高峰期工作擁塞 | 高於平均排隊時間的 2~3 倍 |
Schedule-to-Close | 等待+執行的整體上限 | SLA 需要端到端保障 | 覆蓋整體最壞情況但避免過長 |
Heartbeat | 長任務活性與進度回報 | 批次處理、檔案搬移、匯入 | 5–30 秒;與 checkpoint 一起用 |
原則:
快速檢查:
常見錯誤:
程式碼範例
// 定義 Activity 的超時/重試/心跳等行為,建議在 Activity 層完成
ActivityOptions commonOptions = ActivityOptions.newBuilder()
// 單次執行上限(Start-to-Close):避免單次呼叫卡住
.setStartToCloseTimeout(Duration.ofSeconds(10))
// 佇列等待上限(Schedule-to-Start):避免長時間排隊
.setScheduleToStartTimeout(Duration.ofSeconds(5))
// 端到端上限(Schedule-to-Close):等待+執行的整體上限(可視需要)
.setScheduleToCloseTimeout(Duration.ofSeconds(20))
// 長任務需心跳(Heartbeat),超時視為失敗並可由 checkpoint 繼續
.setHeartbeatTimeout(Duration.ofSeconds(10))
// 重試策略(詳見下一節 RetryOptions)
.setRetryOptions(RetryOptions.newBuilder()
.setMaximumAttempts(5)
.setInitialInterval(Duration.ofSeconds(1))
.setBackoffCoefficient(2.0)
.setMaximumInterval(Duration.ofSeconds(20))
.setDoNotRetry("InvalidInput", "InvalidState")
.build())
.build();
// 在 Workflow 內以 options 建立活動 stub,即可套用以上設定
MyActivities acts = Workflow.newActivityStub(MyActivities.class, commonOptions);
類型 | 作用 | 典型場景 | 設定建議 |
---|---|---|---|
WorkflowRunTimeout | 單次 run 的上限(不跨 run) | 長流程單次執行的最大容忍時間 | 依步驟鏈路最壞情況 × 安全係數;小於 ExecutionTimeout |
WorkflowExecutionTimeout | 整體執行上限(含續跑/重試) | 跨重啟/重試的整體時間邊界 | 覆蓋流程最長預期時間;避免設過大難以觀測 |
WorkflowTaskTimeout | 決策任務(Workflow Task)的上限 | 決策回合/輪詢間的處理 | 維持小值(數秒);通常用預設即可,避免卡住決策迴圈 |
原則:
快速檢查:
常見錯誤:
程式碼範例:
// 設定 Workflow 層的超時
WorkflowOptions wfOptions = WorkflowOptions.newBuilder()
.setTaskQueue("MAIN_TASK_QUEUE")
.setWorkflowRunTimeout(Duration.ofHours(1)) // 單次 run 上限
.setWorkflowExecutionTimeout(Duration.ofDays(1)) // 整體上限(含續跑/重試)
.setWorkflowTaskTimeout(Duration.ofSeconds(10)) // 決策任務小超時(SDK 預設通常足夠)
.build();
// 建立 Workflow stub
MyWorkflow workflow = client.newWorkflowStub(MyWorkflow.class, wfOptions);
讓等待有邊界,流程才穩定;下一篇接著談 Retry Policy 的參數與實務。