3. 架构设计原则:Temporal 架构分层与有状态/无状态设计

Temporal 的架构设计遵循严格的分层原则,将职责明确划分为 Client、Server 和 Worker 三层。这种分层不仅实现了关注点分离,更关键的是通过 无状态 Worker 与 有状态 Server 的对称设计,从根本上解决了分布式工作流中状态一致性与水平扩展的矛盾。

3.1 三层架构总览

每一层都有明确的边界和不可替代的职责。下表总结了各层的核心角色与关键特性:

层次 核心组件 状态特性 主要职责
Client SDK (Go/Java/Python/TypeScript) 无状态 发起工作流/活动、查询状态、发送信号
Server Frontend / History / Matching 服务 有状态 事件持久化、状态机管理、任务调度、故障恢复
Worker 工作流 Worker / 活动 Worker 无状态 执行工作流代码、执行活动代码、上报心跳
核心洞察: 状态集中管理在 Server 层,Worker 只负责执行逻辑。这使得 Worker 可以随时销毁、重启或扩缩容,而不会丢失任何工作流进度。

3.2 无状态 Worker 设计

Worker 是 Temporal 架构中最具弹性的部分。它不保存任何工作流或活动的执行状态,所有状态都通过 gRPC 流与 Server 实时同步。

  • 执行模型: Worker 从 Server 的 Task Queue 中拉取任务,执行完成后将结果(或失败信息)以事件形式写回 Server。
  • 故障恢复: 如果 Worker 崩溃,Server 会在超时后将任务重新分配给其他 Worker。由于 Worker 无状态,新 Worker 可以从上一个已持久化的事件点继续执行。
  • 水平扩展: 只需增加 Worker 进程或 Pod,即可线性提升吞吐量。无需共享存储或会话亲和性。
  • 部署优势: Worker 可以独立发布、回滚,不影响 Server 集群的稳定性。
最佳实践: 将工作流 Worker 和活动 Worker 分离部署。工作流 Worker 通常需要更多 CPU 用于重放(Replay),而活动 Worker 可能更依赖 I/O 或外部服务连接。

3.3 有状态 Server 设计

Server 是 Temporal 的“大脑”,负责维护所有工作流执行的权威状态。它基于 事件溯源(Event Sourcing) 和 确定性重放(Deterministic Replay) 构建。

  • 事件存储: 所有工作流状态变更都以 Append-Only 事件的形式写入持久化存储(如 Cassandra、PostgreSQL、MySQL)。
  • 状态机引擎: History 服务维护每个工作流实例的状态机,通过重放事件序列重建当前状态。
  • 强一致性: 通过分布式锁和事务日志保证同一工作流实例的事件写入顺序,避免冲突。
  • 故障转移: Server 集群通过 Raft 协议(或基于数据库的选主)实现高可用,确保状态不丢失。
注意: Server 的有状态设计并不意味着它是性能瓶颈。通过分片(Sharding)技术,Temporal 可以将不同工作流实例的事件分散到不同的 History 分片,实现近乎线性的扩展能力。

3.4 架构交互流程(SVG 图)

下图展示了 Client、Server 和 Worker 三层之间的典型交互流程,重点突出无状态 Worker 如何与有状态 Server 协同工作:

Temporal 三层架构交互流程 Temporal 三层架构交互流程 Client (SDK) 无状态 · 发起请求 StartWorkflow / Signal Server(有状态) Frontend History Matching Task Queue Task Queue Worker (无状态) 工作流 Worker 活动 Worker Worker (无状态) 活动 Worker 活动 Worker 事件回写 (Event) 说明:Worker 执行完成后,将结果事件写回 Server 的 History 服务,Server 更新状态机。

3.5 无状态 vs 有状态:设计权衡

理解这两种设计模式背后的权衡,是掌握 Temporal 架构的关键:

维度 无状态 Worker 有状态 Server
扩展性 任意扩缩容,无需数据迁移 需分片(Sharding)实现水平扩展
故障恢复 秒级重启,任务自动重新分配 需 Raft 或数据库选主,秒级到分钟级
资源消耗 CPU 和内存用于执行逻辑 大量 I/O 和内存用于事件存储与状态缓存
部署复杂度 低,可独立发布 高,需维护集群和持久化存储
一致性保证 依赖 Server 提供最终一致性 通过事件溯源保证强一致性

3.6 分层架构的边界与数据流(SVG 图)

下面的 SVG 图从数据流角度,进一步细化分层边界,展示事件如何在不同层之间流转:

Temporal 分层数据流与边界 Temporal 分层数据流与边界 Client 边界 Client SDK gRPC 调用 Server 边界(有状态) Frontend 请求路由与验证 History 事件存储与状态机 Matching 任务队列管理 Worker 边界 Workflow Worker 确定性重放 Activity Worker 执行业务逻辑 请求 写入事件 生成任务 分发任务 回写事件 关键边界:Worker 从不直接访问持久化存储,所有状态变更必须通过 Server 的 History 服务。

3.7 设计原则总结

基于上述分层与状态设计,Temporal 架构遵循以下核心原则:

  1. 状态与计算分离: Server 负责状态,Worker 负责计算。这是实现弹性和容错的基础。
  2. 事件驱动: 所有状态变更都通过不可变事件记录,支持审计、重放和调试。
  3. 确定性执行: Worker 的工作流代码必须是确定性的,以保证重放结果一致。
  4. 透明故障转移: 任何 Worker 的故障都不会影响工作流进度,Server 会自动重新调度。
  5. 水平扩展优先: 无状态 Worker 可以无限扩展,Server 通过分片实现扩展。