2. Temporal 核心概念:工作流定义、活动定义、工作流执行、任务队列、命名空间
Temporal 平台围绕五个核心概念构建:工作流定义、活动定义、工作流执行、任务队列和命名空间。理解这些概念是掌握 Temporal 工作流扩展的基础。下面通过结构图、表格和代码示例逐一解析。
核心要点:工作流定义描述业务流程的编排逻辑,活动定义封装具体的业务操作,工作流执行是运行中的实例,任务队列是 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" 命名空间下