在分散式系統中,錯誤處理常常是我們第一個想到的事(Timeout、Retry、冪等性)。但實際上,系統掛掉的原因,更多時候是「流量過大」把自己或下游撐爆。
要同時顧好 上游請求進來時 Worker 能存活,以及 下游服務不被一波流量打掛,Temporal Worker 提供了兩個重要的保護機制:Concurrency Control(併發控制) 與 Rate Control(速率控制)。
ScheduleToStart
排隊上升、吞吐不足。Concurrency 指的是 Worker 同時可以執行多少個任務。
舉例來說:
Rate 指的是 Worker 每秒最多可以處理多少次任務。
舉例來說:
範疇 | 類型 | 作用 | 範圍 | 典型場景 | 設定建議 |
---|---|---|---|---|---|
Concurrency | MaxConcurrentActivityExecutionSize | 同時執行的 Activity 上限 | 單 Worker | 呼叫外部 API、DB I/O | 依 CPU/DB 連線池與外部配額估;先小後大 |
Concurrency | MaxConcurrentWorkflowTaskExecutionSize | 同時處理的 Workflow Task 上限 | 單 Worker | 高吞吐決策回合 | 維持中小值,避免決策迴圈壅塞 |
Concurrency | MaxConcurrentLocalActivityExecutionSize | Local Activity 併發 | 單 Worker | 輕量計算/本地 I/O | 與 CPU/GC 容量對齊 |
Rate | MaxWorkerActivitiesPerSecond | 每個 Worker 的每秒 Activity 速率上限 | 單 Worker | 單機保護、平滑尖峰 | 先低後高,觀測 429/503 再調整 |
Rate | MaxTaskQueueActivitiesPerSecond | Task Queue 的每秒 Activity 上限 | Task Queue | 全域 QPS 上限 | 以下游配額/契約為邊界,預留緩衝 |
ScheduleToStart
高且 CPU 寬鬆 → 提升併發或擴 Worker;MaxWorkerActivitiesPerSecond × Worker 數 ≤ MaxTaskQueueActivitiesPerSecond ≤ 下游限制
。// 建立 WorkerFactory 與 Worker,並同時設定 Concurrency 與 Rate 上限
WorkerFactory factory = WorkerFactory.newInstance(client);
WorkerOptions workerOptions = WorkerOptions.newBuilder()
// Concurrency:同時處理數(以機器資源/DB 連線池為邊界)
.setMaxConcurrentActivityExecutionSize(50) // 單 Worker 同時執行的 Activity 上限
.setMaxConcurrentWorkflowTaskExecutionSize(20) // 同時處理的 Workflow Task 上限
.setMaxConcurrentLocalActivityExecutionSize(20) // Local Activity 上限
// Rate:速率上限(單機與 Task Queue 全域)
.setMaxWorkerActivitiesPerSecond(50.0) // 每個 Worker 的每秒 Activity 上限(單機)
.setMaxTaskQueueActivitiesPerSecond(100.0) // 整個 Task Queue 的每秒 Activity 上限(多 Worker 共享)
.build();
Worker worker = factory.newWorker("MAIN_TASK_QUEUE", workerOptions);
worker.registerWorkflowImplementationTypes(MyWorkflowImpl.class);
worker.registerActivitiesImplementations(new MyActivitiesImpl());
factory.start();
在 Temporal 裡,Timeout 保護 Worker、Retry 爭取恢復;而併發守住機器、速率對齊下游,搭配監控與調整,才能在高流量下維持穩定。
好的,這幾天一口氣展開分散式流程會遇到的關鍵課題,藉此讓我們不僅在開發上有框架,也在維運的設計上有了依據參考。
下一篇,要來解決分散式交易的問題,讓我們談談 Saga Pattern!