该项目是 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
。