返回

文章详情

pg_durable:微软开源数据库内的持久执行

Hacker News2026年6月5日 15:59

长时间运行、容错的 SQL 函数,适用于那些已经在 Postgres 中保存其状态并希望停止将 cron 作业、工作者、队列和状态表拼凑在一起以使后台工作可靠的团队。使用 SQL 定义工作流,让 pg_durable 在每个步骤进行检查点,并在崩溃、重启或步骤失败后继续执行。持久执行现在已成为行业标准模式,而 pg_durable 将其带入 Postgres,且无需额外的服务基础架构。这是我们接近数据的计算使命的一部分。这个功能适合我吗?适用人群:希望将工作流与他们所处理的数据相邻的后端和数据工程师。需要自动化运行手册的 DBA 和 SRE,这些运行手册必须能够在重启后存活并在 SQL 中可审计。构建数据或 AI 管道的团队,需针对每一行、文档或批次实现持久执行。核心思想:pg_durable 函数是一个 SQL 步骤图,PostgreSQL 在执行时会逐步检查点。如果数据库崩溃、重启或某个步骤失败,执行将从最后一个持久检查点恢复,而无需手动重建状态。该功能有用的工作负载:矢量嵌入管道:分块、调用嵌入 API,并插入到 pgvector 中。摄取管道:分阶段、去重、转化和发布大批量数据。定期维护:检测膨胀、通知、等待批准,然后运行下一个操作。扇出聚合:并行运行独立的查询,然后连接结果。外部 API 工作流:增强、分类和 SQL 的 Webhook 风格调用。您今天可能正在做的事情:结合 pg_cron 和作业表、状态列、重试计数器和轮询工作者的解决方案。使用调用回 Postgres 的外部编排工具,如 Airflow、Temporal、Step Functions 或 Argo。一个队列加上工作者加上一个单独的状态表来协调重试和部分完成。一个 plpgsql 程序,直到崩溃或长时间运行的事务迫使您重新开始。痛点:在一个长作业中重启意味着重新运行已经成功的工作。一行失败或一个失败的 API 调用导致手动清理和不确定的重放。长事务保持锁,增加 WAL,并使大规模批处理作业脆弱。应用层的并行工作创造了更多部分失败的错误和漂移的地方。工作流逻辑最终散布在 SQL、工作者、队列、仪表板和状态表中。架构中的变化:工作流定义移入 SQL,并以 df.start(...) 开始。重试状态、进度跟踪和检查点移入 Postgres,而不是定制的应用代码。一些应用层工作者、队列消费者或调度程序的粘合剂可能完全消失。运维可见性来自于 Postgres 表,如 df.instances,使用与您的数据相同的身份验证和备份模型。何时不使用:作业已经是一个单独的 INSERT ... SELECT 或一个普通的 SQL 语句。您需要亚毫秒级同步请求处理,而不是持久的后台执行。您无法在 Postgres 环境中安装扩展或运行后台工作者。工作流主要存在于 Postgres 之外,跨越多个异构系统。您需要的任意应用逻辑无法完美映射到 SQL 步骤、分支、循环或 HTTP 调用。如何工作:使用可组合操作符如 ~> 和 |= 来定义 SQL 中的工作流。使用 df.start() 启动它,并获得一个实例 ID。让运行时以持久的方式执行每一步,并在步骤之间进行检查点。查询状态和结果,自 PostgreSQL 在工作流运行时或完成后。限制:该模型故意设定为 SQL 形状。如果某个步骤需要任意代码、非 HTTP SDK 或丰富的内存控制流,您可能需要将该逻辑包装在 SQL 函数中,将其暴露在 df.http() 的 HTTP 端点后,或为系统的那个部分使用通用的编排工具。功能:持久 - 函数状态持久化到 PostgreSQL。能承受崩溃、重启和故障转移。SQL 原生 - 使用可组合操作符在 SQL 中定义函数。数据库感知 - 用于调度、条件和并行执行的一流原语。零基础设施 - 作为 PostgreSQL 扩展运行。无需 Redis,无需 Temporal,无需外部服务。快速示例 - 一个按步骤处理数据的持久函数 SELECT df.start('SELECT id FROM documents WHERE processed = false LIMIT 100' |=> 'batch' ~> 'UPDATE documents SET processed = true WHERE id = ANY($batch)'); 包装:已标记发布的 Debian 包用于 PostgreSQL 17 和 18 的 amd64 来自 GitHub 发布资产。软件包名称为 pg-durable-postgresql-<PG major>_<pg_durable version>-1_<arch>.deb,并将扩展库、控制文件和 SQL 升级文件安装到匹配的 PostgreSQL 安装目录中。安装软件包后,将 pg_durable 添加到 shared_preload_libraries,重启 PostgreSQL,并在已配置的 pg_durable 数据库中创建扩展:CREATE EXTENSION pg_durable;

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡