2. Temporal 核心概念:工作流定义、活动定义、工作流执行、任务队列、命名空间

Temporal 平台围绕五个核心概念构建:工作流定义、活动定义、工作流执行、任务队列和命名空间。理解这些概念是掌握 Temporal 工作流扩展的基础。下面通过结构图、表格和代码示例逐一解析。

核心要点:工作流定义描述业务流程的编排逻辑,活动定义封装具体的业务操作,工作流执行是运行中的实例,任务队列是 Worker 与 Server 之间的通信通道,命名空间提供多租户隔离。
Temporal 核心概念关系图 Temporal 核心概念关系图 命名空间(Namespace) 任务队列(Task Queue) 工作流定义 Workflow Definition 活动定义 Activity Definition 工作流执行 Workflow Execution 工作流定义编排活动,活动定义执行具体任务,任务队列连接 Worker 与 Server

2.1 工作流定义(Workflow Definition)

工作流定义是使用编程语言(如 Java、Go、Python、TypeScript)编写的业务流程编排代码。它定义了工作流的执行逻辑、状态管理和活动调用顺序。工作流定义具有以下特征:

  • 确定性(Deterministic):相同的输入必然产生相同的执行路径,这是 Temporal 重放恢复的基础。
  • 可重入(Reentrant):工作流代码可以被多次重放,以恢复执行状态。
  • 无副作用:所有外部操作(数据库、API 调用)必须通过活动执行。
最佳实践:工作流定义中不要直接调用外部服务或生成随机数。所有非确定性操作都应封装在活动中。
// Java 工作流定义示例
@WorkflowInterface
public interface OrderWorkflow {
    @WorkflowMethod
    String processOrder(String orderId);
}

public class OrderWorkflowImpl implements OrderWorkflow {
    private final PaymentActivity paymentActivity = Workflow.newActivityStub(PaymentActivity.class);
    private final InventoryActivity inventoryActivity = Workflow.newActivityStub(InventoryActivity.class);

    @Override
    public String processOrder(String orderId) {
        // 1. 扣减库存
        boolean inStock = inventoryActivity.checkAndReserve(orderId);
        if (!inStock) {
            return "OUT_OF_STOCK";
        }
        // 2. 处理支付
        String paymentResult = paymentActivity.charge(orderId);
        // 3. 返回结果
        return paymentResult;
    }
}

2.2 活动定义(Activity Definition)

活动定义封装了具体的业务操作,如数据库写入、调用第三方 API、发送邮件等。活动是非确定性的,可以包含任何副作用操作。活动定义的关键属性:

属性 说明 示例
幂等性 建议活动实现幂等,避免重试导致重复执行 支付扣款使用幂等键
超时控制 每个活动可单独设置执行超时 ScheduleToCloseTimeout = 30s
重试策略 活动失败后自动重试,可配置间隔和最大次数 InitialInterval=1s, MaxRetries=5
心跳 长时间运行的活动通过心跳报告进度 每 10 秒发送一次心跳
// Java 活动定义示例
@ActivityInterface
public interface PaymentActivity {
    @ActivityMethod
    String charge(String orderId);
}

public class PaymentActivityImpl implements PaymentActivity {
    @Override
    public String charge(String orderId) {
        // 调用支付网关(非确定性操作)
        PaymentGateway.charge(orderId);
        return "SUCCESS";
    }
}

2.3 工作流执行(Workflow Execution)

工作流执行是工作流定义的运行实例。每次调用工作流方法都会创建一个新的执行实例,具有唯一的 WorkflowId 和 RunId。工作流执行的核心特性:

  • 持久化状态:执行状态持久化存储在 Temporal Server 中,即使 Worker 崩溃也不会丢失。
  • 事件溯源:所有状态变更通过事件日志记录,支持重放恢复。
  • 长时间运行:工作流执行可以持续数天、数月甚至数年。
  • 唯一标识:WorkflowId 业务唯一,RunId 每次执行唯一。
注意:工作流执行有最大执行时间限制(默认 1 年),可通过命名空间配置调整。超时未完成的工作流会被强制终止。
工作流执行生命周期 工作流执行生命周期 启动 运行中 暂停 完成 失败 工作流执行可暂停、恢复、重试,最终进入完成或失败状态

2.4 任务队列(Task Queue)

任务队列是 Temporal Server 与 Worker 之间的通信通道。工作流任务和活动任务通过不同的任务队列分发。任务队列的核心作用:

任务类型 队列用途 消费方
Workflow Task Queue 分发工作流任务(决策任务) Workflow Worker
Activity Task Queue 分发活动任务(执行任务) Activity Worker
  • 负载均衡:多个 Worker 监听同一队列,自动实现任务分发。
  • 弹性伸缩:增加 Worker 实例即可提升处理能力。
  • 任务路由:通过队列名称将特定任务路由到指定 Worker 组。
// 创建 Worker 并监听任务队列
Worker.Factory factory = Worker.Factory.newInstance(client);
Worker worker = factory.newWorker("order-processing-queue");
worker.registerWorkflowImplementationTypes(OrderWorkflowImpl.class);
worker.registerActivitiesImplementations(new PaymentActivityImpl(), new InventoryActivityImpl());
factory.start();

2.5 命名空间(Namespace)

命名空间是 Temporal 中的多租户隔离单元。每个命名空间拥有独立的工作流执行空间、配置和权限。命名空间的关键用途:

  • 环境隔离:开发、测试、生产环境使用不同命名空间。
  • 业务隔离:不同业务线或团队使用独立命名空间。
  • 配置管理:每个命名空间可独立配置归档策略、执行超时、重试参数。
命名空间属性 说明 典型值
Name 命名空间唯一名称 production-order
Retention Period 工作流执行历史保留时间 30 天
Archival State 是否启用归档 Enabled / Disabled
Workflow Execution Timeout 工作流最大执行时间 365 天
// 使用命名空间创建 Temporal Client
WorkflowServiceStubs service = WorkflowServiceStubs.newInstance();
WorkflowClient client = WorkflowClient.newInstance(service, "production-order-ns");
// 所有工作流执行都在 "production-order-ns" 命名空间下