Show HN:基于Postgres构建的Temporal无缝替代方案DBOSify
速览
DBOSify是一个开源项目,旨在作为Temporal的即插即用替代品。它基于Postgres数据库构建,为开发者提供了另一种分布式工作流执行引擎的选择。该项目允许用户在不大幅修改代码的情况下,将现有的Temporal基础设施迁移至DBOSify。
AI 深度解读
Show HN: DBOSify – 基于 Postgres 的 Temporal 即插即用替代品
背景
在分布式系统开发中,Temporal 是构建可靠工作流(Durable Workflows)的事实标准框架。然而,Temporal 的架构依赖于一套复杂的微服务基础设施,包括 Temporal Server、Cassandra 或 PostgreSQL 作为后端存储,以及 gRPC 通信协议。对于许多中小型项目或希望简化运维栈的团队来说,维护这套独立的 Temporal 基础设施往往被视为一种负担。
DBOSify 的出现正是为了解决这一痛点。作为一个在 Hacker News 上展示的开源项目,它旨在提供一个“即插即用”(Drop-in)的替代方案。其核心理念是:既然大多数现代应用已经在使用 PostgreSQL,为什么不直接利用现有的数据库来承载工作流状态,从而消除对额外 Temporal Server 的依赖呢?
核心内容
DBOSify 是一个基于 Python 的库,它作为 Temporal Python SDK 的替代品,利用 PostgreSQL(通过 DBOS Transact 层)取代了传统的 Temporal Server。这意味着开发者可以在无需部署任何额外基础设施(除了 PostgreSQL)的情况下,运行持久化工作流、活动(Activities)、信号(Signals)、更新(Updates)、重试机制以及故障恢复。
使用方式与代码示例
DBOSify 的设计目标是成为 Temporal 的无缝替代品。开发者只需将导入语句从 temporalio 更改为 dbosify,并将客户端和工作者(Workers)连接到 PostgreSQL 数据库即可。
安装命令:
pip install dbosify
代码对比示例:
以下是使用 DBOSify 编写的标准工作流代码,其结构与 Temporal 高度相似:
import asyncio
import os
from datetime import timedelta
from dbosify import activity, workflow
from dbosify.client import Client
from dbosify.worker import Worker
# 设置指向你的 PostgreSQL 数据库的连接字符串
DB_URL = os.environ.get("DBOS_SYSTEM_DATABASE_URL")
@activity.defn
async def compose_greeting(name: str) -> str:
return f"Hello, {name}!"
@workflow.defn
class GreetingWorkflow:
@workflow.run
async def run(self, name: str) -> str:
return await workflow.execute_activity(
compose_greeting, name, start_to_close_timeout=timedelta(seconds=10)
)
async def main() -> None:
worker = Worker(
DB_URL,
task_queue="greetings",
workflows=[GreetingWorkflow],
activities=[compose_greeting],
)
async with worker:
async with await Client.connect(DB_URL) as client:
result = await client.execute_workflow(
GreetingWorkflow.run, "World", id="greeting-1", task_queue="greetings"
)
print(result) # 输出: Hello, World!
if __name__ == "__main__":
asyncio.run(main())
底层架构原理
DBOSify 将每个 Temporal 工作流转换为由 PostgreSQL 支持的 DBOS 工作流。其核心机制包括:
-
确定性解释器(Deterministic Interpreter): 工作流(包括主协程以及信号、更新和查询处理程序)在一个虚拟事件循环上运行。该事件循环仅在事件到达时推进。
-
检查点机制: 利用 DBOS 步骤和工作流通信原语,所有非确定性操作在观察到它们之前都会被检查点(Checkpointed)保存到 PostgreSQL 中。
-
功能映射:
- 活动与时钟:转化为 DBOS 步骤和持久化睡眠(Durable Sleeps),并在完成时进行检查点记录。
- 信号、更新与取消:通过 PostgreSQL 的
LISTEN/NOTIFY机制作为持久化消息传递。 - 故障恢复:当工作流在新工作者上重新运行时,解释器会根据记录的检查点重放相同的一系列操作,从而从断点处恢复执行,并确保“恰好一次”(Exactly Once)的执行语义。
- 命名空间隔离:每个命名空间映射到独立的 PostgreSQL Schema;
Client封装了 DBOS 客户端,Worker封装了 DBOS 运行时。
兼容性与测试策略
为了证明其作为“即插即用”替代品的有效性,DBOSify 采用了严格的测试策略,涵盖正确性和对 Temporal 的兼容性:
- 测试移植:移植了所有相关的 Temporal Python 单元测试和集成测试。
- 示例应用验证:移植了相关的 Temporal Python 示例应用程序,以验证 DBOSify 确实是即插即用的。
- 故障恢复测试:新增单元测试和集成测试,重点在于“杀死并恢复”(kill-and-recover)测试,以验证确定性故障恢复能力。
- 签名一致性测试:通过机械方式断言这些库的公共 API 签名完全相同(有记录的例外情况除外)。
限制与差异
尽管 DBOSify 在 Python SDK 层面提供了极高的兼容性,但它并非 Temporal 的完整二进制兼容替代品,存在以下关键限制:
- 无 Wire Protocol 兼容性:没有 gRPC 线协议兼容性。其他语言的 Temporal SDK 无法连接到 DBOSify。它完全取代了 Temporal Server 和 Python SDK,仅适用于纯 Python 应用程序。
- 无官方 UI/CLI:不提供 Temporal Web UI、
temporalCLI 或tctl。开发者需使用 DBOS 的工作流管理 API 和 DBOS Conductor 来操作工作流。
关键要点
- 极简基础设施:仅需 PostgreSQL 即可运行持久化工作流,无需维护独立的 Temporal Server 集群。
- Python 专用替代:它是 Temporal Python SDK 的直接替代品,API 签名保持一致,代码迁移成本极低。
- 基于检查点的确定性执行:利用 PostgreSQL 存储状态,通过确定性解释器和检查点机制实现故障恢复和恰好一次执行语义。
- 通信机制差异:使用 PostgreSQL 的
LISTEN/NOTIFY处理信号和更新,而非 gRPC。 - 生态隔离:不支持多语言互操作(其他语言 SDK 无法连接),也不提供 Temporal 的 Web UI 或 CLI 工具。
- 安装简单:通过
pip install dbosify即可快速集成。
意义与影响
DBOSify 的出现反映了开发者对简化分布式系统基础设施的强烈需求。对于主要使用 Python 技术栈的团队而言,它提供了一种极具吸引力的架构选择:
- 降低运维复杂度:消除了 Temporal Server 及其依赖项(如 Cassandra/PostgreSQL 集群管理、gRPC 服务发现等)的运维负担。对于已经重度依赖 PostgreSQL 的团队,这意味着更少的组件、更低的延迟和更简单的监控体系。
- 加速开发迭代:由于 API 的高度兼容性,开发者可以几乎零成本地将现有 Temporal 代码迁移到 DBOSify,或者在新项目中直接采用更轻量的方案。
- 推动“Database-First”工作流范式:DBOSify 强化了将工作流状态直接存储在关系型数据库中的理念,证明了现代 RDBMS 足以支撑复杂的分布式事务和状态机逻辑,无需引入额外的专用中间件。
然而,对于需要多语言微服务协作、或者依赖 Temporal 生态工具链(如 Web UI 进行调试)的大型企业架构,DBOSify 目前并非合适的选择。它主要服务于那些寻求轻量化、Python 优先且希望利用现有数据库基础设施的开发团队。
