随着更多服务向云迁移,许多组织选择微服务来简化开发流程、提高可靠性,并加速功能迭代。然而,开发和部署微服务可能隐藏着复杂性。如果你正在从使用事务来保证数据安全和一致性的一体化服务迁移,那么如何将这些模式转化到分布式微服务世界呢?
在这篇博文中,为两部分系列的第一篇,我们将向你介绍 Temporal 和 **PlanetScale DB**,并展示使用这两个强大技术管理工作流的优势:可靠且省力。


什么是 Temporal?

随着组织和应用的规模扩大,单体架构通常会演变为微服务的集合。开发者必须开始考虑如何让这些独立系统协同工作。对于过去七年内开始从事软件开发的工程师来说,你可能已经在日常工作中接触了许多分布式系统的概念。Temporal 是一个开源的分布式、可扩展的工作流编排引擎,能够同时运行数百万个工作流。
Temporal 为你处理了许多分布式系统模式,使你可以在更高的抽象层次上编写代码,而不必关注如何重新实现这些模式。它开箱即用地提供了可靠性、容错性和可扩展性,让你专注于编写业务逻辑。
让我们通过定义更深入地理解:

  • 工作流 (Workflows):工作流包含状态并描述需要执行的活动或任务。
  • 活动 (Activities):任务可能会失败,例如调用服务。活动会自动重试,并通过任务队列分布到工作池中进行执行。

本质上,使用 Temporal,故障处理由 Temporal 引擎负责,而无需应用开发者操心。它提供了可靠功能执行的假象,并告诉代码何时运行。注册工作流实现以及该工作流需要运行的活动实现是至关重要的一步。
下图展示了一个 Temporal 集群,该集群由四个独立可扩展服务组成。(来源:Temporal.io)
Temporal 集群示意图
这些独立可扩展服务包括:

  • 前端网关:负责速率限制、路由和授权。
  • 历史子系统:维护数据(可变状态和定时器)。
  • 匹配子系统:托管任务队列以进行调度。
  • 工作者服务:处理内部的后台工作流。

持久性 (Durability)

Temporal 将工作流执行(或工作流步骤)的进度记录在名为“历史”的日志中。在发生崩溃时,Temporal 会重新启动工作流程,即重新启动工作流执行,去除所有已经执行的活动调用的重复内容,并赶上之前的进度。这一切都无需在应用代码中有任何特别处理,意味着故障处理完全脱手交给 Temporal。


“长时间运行”的工作流示例

为了更清晰地说明如何使用 Temporal 编程,值得讨论长时间运行的工作流以及一些与开发者和基础设施团队相关的业务用例。长时间运行并不是指某种随意的时间限制——它可以是很短时间或无限长时间。工作流可以是你已经在单一服务或应用中实现的内容。以下是从 Temporal 博客中找到的两个有帮助的例子:

  1. Box 使用 Temporal 来组织文件更新操作。尽管对于大型传输来说可能需要几个小时,但对用户来说大多数操作感觉是即时完成的。理想情况下,我们希望一种解决方案能够从最小用例扩展到最大用例,同时保持尽可能低的可见延迟。Box 使用 Temporal 提供微服务编排的事务性和可靠性保证,而“长时间运行”这一词组甚至从未被提及过。
  2. Checkr 使用 Temporal 来协调背景检查。这是一个多阶段流程,处理时间范围很广,从调用数据库搜索 API 到派遣法院研究人员到法院,然后分析每条记录,甚至可能手动 QA。该过程可能需要数天完成,而 Temporal 通过将事件历史记录作为事实来源解决了可观察性和可靠性问题。

实际上,这意味着你可以编写无限期运行的工作流。例如,可以将其用于各种电商场景:

  • 组织如忠诚度奖励的行动。
  • 订阅收费。
  • 在整个客户生命周期中设置提醒邮件。

PlanetScale 在其中的作用

一个 Temporal 集群包括 Temporal Server 和一个持久化层(即数据存储层)。所有工作流数据——任务队列、执行状态、活动日志——都存储在一个持久的数据存储中。Temporal 提供两种存储选项:

  1. SQL 选项:(MySQL 和 PostgreSQL)。
  2. No-SQL 选项:(Cassandra)。

如果选择 SQL,你可以获得操作简单但扩展性较低的解决方案。如果选择 No-SQL,你可以获得良好的扩展性,但操作复杂。选择 PlanetScale 则同时满足操作简单和扩展性高的需求。
PlanetScale 的核心基于 MySQL,并使用 Vitess 作为中间层支持。Vitess 于 2010 年为解决 YouTube 的扩展问题而诞生。自此,该开源项目不断成长,帮助多家公司(例如 Slack 和 Square)应对其海量数据扩展需求。
这意味着 PlanetScale 完美针对高负载的分布式应用构建,其数据库能够完成 Temporal 的简单部署。
应用程序、Temporal 和数据库组件示意图
PlanetScale 通过水平扩展来结合任意数量的 MySQL 实例,并将数据根据自定义分区策略水平分区到这些集群中。由于 Temporal 也使用水平分区(详见官方文档),Temporal 可以无缝适配 PlanetScale,并充分利用其相较单个 MySQL 实例的扩展性改进。


Temporal 入门

快速安装和运行 Temporal 集群的四种方式:

  1. Docker:使用 Docker Compose 可以轻松在本地开发 Temporal 应用。
  2. Render:我们对 Temporal 的 Docker Compose 使用体验被翻译到 Render 的 Blueprint 格式中,用于云连接。
  3. Helm 图表:将集群部署到 Kubernetes 是测试系统和开发 Temporal 应用的简便方法。
  4. Gitpod:Go 和 TypeScript 的一键部署可用。

Temporal 不建议在正式生产环境中使用这些方法,因此它们仅供开发使用。要将 PlanetScale 与 Temporal 配合使用,可以使用 Docker Compose,并手动在 PlanetScale 中创建 temporaltemporal_visibility 表。
在下一篇文章中,我们将展示如何通过示例设置 Docker Compose 文件以在 PlanetScale 上运行。



使用 PlanetScale 实现大规模 Temporal 工作流:第一部分插图

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:http://www.choupangxia.com/2025/09/07/planetscale-temporal/