1. 使用 SDK 开发 Worker 程序

使用 Temporal SDK 可以很方便地开发 Worker 程序。下面是一个 Go 示例程序。

其中 Worker Entity 的 Run() 方法封装 Poll Task、Call Function、Repond Completed 等一些列操作。接下来,我们使用 Temporal Client API 模拟 Activity Worker Entity 的 Run() 方法。


2. 使用 Temporal Client API 开发 Activity Worker

下面通过一个示例进行说明。

项目结构:

go.mod:

external_activity_worker.go:

worker/workflow_worker.go:

workflow/handle_name.go:

可以看到,通过:


3. Facade Service

我们将生成工作流执行;获取打开的工作流执行列表;获取工作流执行的进展;从 Activity 任务队列中拾取任务;向 Temporal 集群发送心跳;向 Temporal 集群响应执行结果等 Client API 封装到 Rest Service 里,通过Rest JSON API 将它们暴漏给外部用户。因为该服务是进入 Temporal 集群的门面,所以称之为 Facade Service。

引入 Facade Service 后,系统架构如下:

custom-platformization-architecture.jpg

引入 Facade 带来的好处包括但不限于:

计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决。

Temporal 为方便开发,给我们提供各种语言的 SDK。在当前的设计中,Temporal 已作为基础设施,被我们隐藏起来,用户无法感知其存在。因此我们提供自己的 SDK,方便用户使用 Facade Service。

下面是一个简单的 Facade Service 示例。

项目结构:

go.mod:

main.go:


4. Workflow DSL

在 Temporal 中,工作流定义(Workflow Definition)是代码。如果想新增或修改工作流定义,那么将新增或修改 Workflow Worker。为此,我们引入 Workflow DSL(Domain Specific Language),使整个系统中只有一个工作流定义,该工作流定义根据输入参数,决定生成哪些 Activity,以及如何生成 Activity。

引入 Workflow DSL 后,系统架构如下:

custom-platformization-architecture-with-dsl.jpg

想要新增或修改工作流定义时,只需要新增或修改 Workflow DSL 即可,无需上线或新增 Workflow Worker。

下面是一个简单的 DSL Workflow 示例。

项目结构:

go.mod:

activity/activity_one.go:

activity/activity_two.go 和 activity/activity_three.go 与 activity/activity_one.go 类似,分别定义 ActivityTwo、ActivityThree 函数。

worker/activity_one_worker.go:

worker/activity_two_worker.go 和 worker/activity_two_worker.go 与 worker/activity_one_worker.go 类似,分别注册 ActivityTwo 和 ActivityThree。

workflow/dsl_worker.go:

worker/dsl_workflow_worker.go: