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 协同工作:
3.5 无状态 vs 有状态:设计权衡
理解这两种设计模式背后的权衡,是掌握 Temporal 架构的关键:
| 维度 | 无状态 Worker | 有状态 Server |
|---|---|---|
| 扩展性 | 任意扩缩容,无需数据迁移 | 需分片(Sharding)实现水平扩展 |
| 故障恢复 | 秒级重启,任务自动重新分配 | 需 Raft 或数据库选主,秒级到分钟级 |
| 资源消耗 | CPU 和内存用于执行逻辑 | 大量 I/O 和内存用于事件存储与状态缓存 |
| 部署复杂度 | 低,可独立发布 | 高,需维护集群和持久化存储 |
| 一致性保证 | 依赖 Server 提供最终一致性 | 通过事件溯源保证强一致性 |
3.6 分层架构的边界与数据流(SVG 图)
下面的 SVG 图从数据流角度,进一步细化分层边界,展示事件如何在不同层之间流转:
3.7 设计原则总结
基于上述分层与状态设计,Temporal 架构遵循以下核心原则:
- 状态与计算分离: Server 负责状态,Worker 负责计算。这是实现弹性和容错的基础。
- 事件驱动: 所有状态变更都通过不可变事件记录,支持审计、重放和调试。
- 确定性执行: Worker 的工作流代码必须是确定性的,以保证重放结果一致。
- 透明故障转移: 任何 Worker 的故障都不会影响工作流进度,Server 会自动重新调度。
- 水平扩展优先: 无状态 Worker 可以无限扩展,Server 通过分片实现扩展。