1. 基于任务队列负载弹性伸缩 Worker(暂时行不通)

Temporal 官网的说明在:https://docs.temporal.io/server/production-deployment/#faq-autoscaling-workers-based-on-task-queue-load

翻译如下:

Temporal 尚未支持返回任务队列中的任务数量。主要的技术障碍是每个任务可以有它自己的 ScheduleToStart 超时,因此仅计算添加和消费多少任务是不够的。

这就是我们建议追踪 schedule_to_start_latency 来确定任务队列是否有积压(对于给定的任务队列 Workflow 和 Activity Worker 配置不足)的原因。我们计划未来添加一些特性,提供更多对任务队列状态的可见性。


2. 基于 Workflow Execution 弹性伸缩 Worker

2.1. 通过 Query 获取 Workflow Execution 的当前进度

下面通过示例进行说明。

项目结构如下:

go.mod:

main.go:

worker/main.go:

workflow/autoscaling_workflow.go:

workflow/model.go:

启动 Worker:

引发工作流执行:

得到类似下面的输出:

上面的例子说明:通过 Query,可以获取工作流执行执行已推进到哪个 Activity。请查看官方文档获取更多关于 Query 的细节。

2.2. 通过 Temporal Client 获取正在打开的 Workflow Execution

下面通过示例进行说明。

list_open_workflow_execution.go:

然后通过程序或 tctl 引发若干工作流执行。最终得到类似下面的输出:

2.3. 如何基于 Workflow Execution 弹性伸缩 Worker
  1. 通过 Temporal Client 获取关注的 Workflow Definition 的全部 Workflow Execution(可基于 Workflow Execution 的总数 Autoscale Workflow Worker)
  2. 通过 Query 逐一地获取全部 Workflow Execution 的进展(已推进到哪个 Activity)
  3. 通过上一步获取到的进展,统计出所有 Activity 的数量,然后基于它 Autoscale Activity Woker