本指南提供详尽的 Temporal Worker 概览。
在日常交流中,术语 Worker 用于代表 Worker 程序(Worker Program)、Worker 进程(Worker Process)或 Worker 实体(Worker Entity)。Temporal 文档旨在明确及说明它们之间的区别。
Worker 程序(Worker Program)是定义 Worker 进程的约束的静态代码,它是使用 Temporal SDK 的 API 开发的。
实现指南:
Worker 实体(Worker Entity)是 Worker 进程里的独立的 Worker,它监听特定的任务队列(Task Queue)。
Worker 实体监听及轮询单个任务队列。Worker 实体既包含 Workflow Worker,也包含 Activity Worker,以便它可以取得工作流执行(Workflow Execution)和 Activity 执行(Activity Execution)的进展。
一个 Worker 可以处理比它的缓存大小或支持的线程数更多的工作流执行吗?
可以,但代价是增加延迟。
Worker 是无状态的,因此任何处于阻塞状态的工作流执行都可以安全地从 Worker 中移除。稍后,当需要出现时(以外部事件的形式),它可以在相同或不同的 Worker 上复活。因此,假设 Worker 可以处理更新速率,并且不关心稍高的延迟,那么单个 Worker 可以处理数以百万计的打开的工作流执行。
操作指南:
Worker 进程负责轮询任务队列、出列一个任务(Task)、执行响应任务的代码,以及向 Temporal 集群响应结果。
更正式地说,Worker 进程是实现任务队列协议(Task Queue Protocol)和任务执行协议(Task Execution Protocol)的任意进程。
Worker 进程处于 Temporal 集群的外部。Temporal 应用程序开发者负责开发 Worker 程序(Worker Programs)以及操作 Worker 进程。换种说法,Temporal 集群(包括 Temporal Cloud)不在 Temporal 集群机器上执行你的任何代码(Workflow & Activity 定义)。集群只负责编排状态转移,以及向下一个可用的 Worker 实体提供任务。
默认情况下,用 mTLS 加密事件历史中传输的数据,它在 Temporal 集群中仍然可读。
为解决该问题,Temporal SDK 提供数据转换器 API(Data Converter API),可以使用它来定制流出和流回到 Worker 实体的数据的序列化,保证 Temporal 不能读敏感的业务数据。
在我们的许多教程中,我们向你展示在本地开发时,如何在同一台机器上同时运行 Temporal 集群和 Worker。但是,生产级 Temporal 应用程序通常有一组 Worker 进程,它们全部运行在 Temporal 集群外部的主机上。Temporal 应用程序可以按照需要拥有尽可能多的 Worker 进程。
Worker 进程可以同时是 Workflow Worker 进程和 Activity Worker 进程。许多 SDK 支持在单个 Worker 进程中拥有多个 Worker 实体的能力。(Worker 实体的创建和管理在 SDK 之间有所不同。)单个 Worker 实体仅能监听单个任务队列。但如果 Worker 进程有多个 Worker 实体,那么 Worker 进程可以监听多个任务队列。
执行 Activity 任务的 Worker 进程必须能够访问执行 Activity 定义中定义的操作所需的任何资源,比如:
Temporal 集群自身有用于系统工作流执行的内部 worker(internal workers)。但这些内部 Worker 对开发者不可见。