Show HN: DBOSify – 基于Postgres的Temporal即插即用替代方案
摘要
DBOSify 是 Temporal Python 的即插即用替代方案,它使用 Postgres 替代 Temporal 服务器,无需额外基础设施即可实现持久化工作流。
查看缓存全文
缓存时间: 2026/06/27 03:48
dbos-inc/dbosify-py
来源:https://github.com/dbos-inc/dbosify-py
DBOSify
DBOSify 是 Temporal Python (https://github.com/temporalio/sdk-python) 的即插即用替代方案,它使用 Postgres(通过 DBOS Transact (https://github.com/dbos-inc/dbos-transact-py))来代替 Temporal 服务器。这样就可以在无需任何基础设施(Postgres 除外)的情况下运行持久化工作流、活动、信号、更新、重试和恢复。
使用此库时,请将 dbosify 导入以替代 temporalio,并将工作进程和客户端连接到 Postgres 数据库:
使用方式
安装:
pip install dbosify
这是一个即插即用的替代方案:只需导入 dbosify 而非 temporalio,并将客户端和工作进程连接到 Postgres 数据库而非 Temporal 服务器。更多文档请参考这里 (https://docs.dbos.dev/explanations/dbosify)。
import asyncio
import os
from datetime import timedelta
from dbosify import activity, workflow
from dbosify.client import Client
from dbosify.worker import Worker
# 设置为你 Postgres 数据库的连接字符串
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 工作流作为基于 Postgres 的 DBOS 工作流运行。一个确定性解释器在虚拟事件循环上运行该工作流(包括其主协程、信号、更新和查询处理程序),该事件循环仅在有事件到达时才会推进。利用 DBOS 步骤和工作流通信原语 (https://docs.dbos.dev/python/tutorials/workflow-communication),所有非确定性操作都会在工作流观察到之前被检查点到 Postgres 中。
- 活动和定时器 成为 DBOS 步骤和持久化休眠,每一步在完成时都会被检查点保存。
- 信号、更新和取消 是通过 Postgres 的 LISTEN/NOTIFY 传递的持久化消息。
- 恢复 在新的工作进程上重新运行工作流:解释器针对已记录的检查点重放相同序列的操作,因此执行将从上次中断处恢复并恰好完成一次。
- 命名空间 各自映射到自己的 Postgres 模式;
Client封装了 DBOS 客户端,Worker封装了 DBOS 运行时。
测试方式
由于 DBOSify 是 Temporal 的即插即用替代方案,其测试涵盖了正确性和与 Temporal 的一致性,采用以下策略:
- 移植所有相关的 Temporal Python 单元测试和集成测试
- 移植相关的 Temporal Python 示例应用,验证 DBOSify 是即插即用的替代方案
- 新增单元测试和集成测试,重点是通过 kill-and-recover 测试验证确定性故障恢复
- 签名一致性测试,机械地断言这些库的公共 API 是相同的(有文档记录的特例除外)
这不是什么
- 没有有线协议兼容性。 没有 gRPC 有线兼容性。其他语言的 Temporal SDK 无法连接。此方案仅针对纯 Python 应用,完全替换了 Temporal 服务器和 Python SDK。
- 没有 Temporal Web UI、
temporalCLI 或 tctl。 你可以使用 DBOS 的工作流管理 API 和 DBOS Conductor 来操作工作流。有关架构差异和功能兼容性的信息,请参见 此文档。
相似文章
期待 PostgreSQL 19:是时候了
PostgreSQL 19 终于将引入原生的时态表支持,遵循 SQL:2011 标准,取代过去使用排除约束的手动方法。本文解释了当前方法的局限性以及新功能备受期待的优点。
Show HN: Honker – 为 SQLite 带来 Postgres NOTIFY/LISTEN 语义
Honker 是一个 SQLite 扩展,为 SQLite 添加 PostgreSQL 风格的 NOTIFY/LISTEN 语义,无需外部代理或轮询即可实现持久化的发布/订阅与任务队列。
pg_durable: 微软开源数据库内持久化执行
微软开源了pg_durable,这是一个PostgreSQL扩展,支持长时间运行的SQL函数的持久化执行,具有自动检查点和容错恢复功能。
@ycombinator: Ardent (@ArdentAI) 让你在 TB 级规模下 <6秒 克隆任何 Postgres 数据库,让编码代理可以测试代码,工程团队可以快速上线而不用担心影响生产…
Ardent 是一款 Y Combinator 支持的工具,能在 TB 级规模下于 6 秒内克隆任何 PostgreSQL 数据库,让编码代理和开发者可以在接近生产环境的克隆副本上测试代码,而不会造成停机风险。该工具已被 Supermemory 和 Surface Labs 等公司采用。
Show HN: Streambed – 将Postgres流式传输到S3上的Iceberg,支持Postgres Wire协议
Streambed是一个开源的CDC引擎,它将Postgres的WAL变更流式传输到S3上的Iceberg表,并内置了一个使用DuckDB的查询服务器,该服务器支持Postgres wire协议。