該項目是 100% 實驗性的。請不要嘗試在任何生產和/或共用環境中安裝控制器。
臨時工作執行緒控制器的目標是在利用工作執行緒版本控制的同時,輕鬆在 Kubernetes 上執行工作執行緒。
時間的確定性約束在推出或回溯工作流程程式碼變更時可能會造成麻煩。
工作流程確定性的傳統方法是在版本控制檢查背後控制新行為。隨著時間的推移,這些檢查可能會成為技術債的來源,因為從程式碼庫中安全地刪除它們是一個謹慎的過程,通常涉及查詢所有正在運行的工作流程。
工作執行緒版本控制是一種替代方法,它使工作流程執行能夠與執行特定程式碼修訂的工作執行緒保持一致。這允許工作流程作者省略程式碼中的版本檢查,而是並行運行其工作線程的多個版本,依靠 Temporal 將工作流程執行固定到運行相容程式碼的工作線程。
該專案旨在提供自動化,從而簡化追蹤哪些工作程序版本仍然具有活動工作流程、管理版本化工作程序部署的生命週期以及調用臨時 API 以在部署後更新預設版本的記帳工作。
註冊新的worker版本
建立版本化的工作部署資源
刪除無法存取的工作部署
新工作版本的手動、藍/綠和漸進式推出
自動擴展工作人員部署
自動滾動到相容的工作版本
新worker版本的金絲雀分析
舊版工作流程逾時後可選擇取消
將ContinueAsNew
訊號傳遞給舊版本上的工作流程
為了與此控制器相容,需要使用以下標準環境變數來配置工作人員:
WORKER_BUILD_ID
TEMPORAL_HOST_PORT
TEMPORAL_TASK_QUEUE
TEMPORAL_NAMESPACE
其中每一個都將在 pod 模板的 env 中自動設置,不需要在TemporalWorker
規範之外手動指定。
每個TemporalWorker
資源管理一個或多個標準Deployment
資源。每個部署都管理 pod,這些 pod 反過來輪詢 Temporal 以查找固定到各自版本的任務。
流程圖TD
wd[時間工作者]
子圖“最新/預設工作版本”
d5["部署 v5"]
rs5["副本集 v5"]
p5a["Pod v5-a"]
p5b["Pod v5-b"]
p5c["Pod v5-c"]
d5 --> rs5
rs5 --> p5a
rs5 --> p5b
rs5 --> p5c
結尾
子圖“已棄用的工作版本”
d1["部署 v1"]
rs1["副本集 v1"]
p1a["Pod v1-a"]
p1b["Pod v1-b"]
d1 --> rs1
rs1 --> p1a
rs1 --> p1b
dN["部署..."]
結尾
WD --> d1
WD --> DN
WD --> d5
p1a-. “民意調查版本 v1”.-> 伺服器
p1b -. “民意調查版本 v1”.-> 伺服器
p5a-. “民意調查版本 v5”.-> 伺服器
p5b -. “民意調查版本 v5”.-> 伺服器
p5c-. “民意調查版本 v5”.-> 伺服器
伺服器[“臨時伺服器”]
載入中當部署新的工作程序版本時,工作程序控制器會自動在 Temporal 中註冊新的預設工作程序版本。
隨著舊工作流程完成執行並且不再需要已棄用的工作程序版本,工作程序控制器也透過刪除舊部署來釋放資源。
序列圖
自動編號
參與者 Dev 作為開發人員
參與者 K8s 作為 Kubernetes
參與者 Ctl 作為 WorkerController
參與者 T 作為時間
Dev->>K8s:建立 TemporalWorker「foo」(v1)
K8s-->>Ctl:通知 TemporalWorker「foo」已建立
Ctl->>K8s:建立部署“foo-v1”
Ctl->>T:將 v1 註冊為新的預設值
Dev->>K8s:更新 TemporalWorker「foo」(v2)
K8s-->>Ctl:通知 TemporalWorker「foo」已更新
Ctl->>K8s:建立部署“foo-v2”
Ctl->>T:將 v2 註冊為新的預設值
Ctl->>Ctl:在 v1 和 v2 之間執行重大變更偵測
Ctl->>T:如果版本相容,則合併 v1 和 v2。
循環輪詢時間 API
Ctl-->>T:等待 v1 工作流程執行關閉
結尾
Ctl->>K8s:刪除部署“foo-v1”
載入中該項目還處於早期階段;因此,尚未徵求此類外部程式碼貢獻。
歡迎錯誤回報和功能請求!請提出問題。
如果您有問題、建議或有興趣做出其他貢獻,也可以在 Temporal Slack 上聯絡@jlegrone
。