开发者生态
evening
微软开源用于数据库内持久执行的 PostgreSQL 扩展
2026-06-16
1 阅读
作者:Sergio De Simone
pg_durable " 是 微软最近开源 "的一款 PostgreSQL 扩展。它支持在数据库内部原生运行持久化工作流,而不需要依赖外部的编排系统。 据微软介绍,pg_durable 使开发人员不用将 cron 任务、后台工作单元、消息队列和外部协调器拼接在一起,即可实现长期运行且具有容错能力的 SQL 函数。而且,工作流直接通过 SQL 表达,该扩展负责处理重试、扇出和恢复等执行相关的问题。 借助 pg_durable,工作流可以直接在 SQL 中定义,重试状态、进度跟踪和检查点管理完全在 PostgreSQL 内部完成,无需依赖外部应用程序。微软指出,这样做的一大优势在于“某些应用层工作单元、队列消费者或调度器粘合层会完全消失”。 pg_durable 函数是一个 SQL 执行步骤图,PostgreSQL 在执行过程中会对其进行检查点记录。如果数据库发生崩溃、重启或某个步骤失败,系统将从最后一个持久检查点继续执行,而无需手动重建状态。 该扩展将函数的执行状态持久化存储在 PostgreSQL 表中,确保工作流在系统崩溃、重启和故障转移时仍然能正常运行。它提供了一种领域特定语言(DSL),其中包含用于调度、条件和并行执行等操作的一等原语。 以下是一个简短的示例,展示了一个分步骤处理数据的持久化函数: SELECT df.start( 'SELECT id FROM documents WHERE processed = false LIMIT 100' |=> 'batch' ~> 'UPDATE documents SET processed = true WHERE id = ANY($batch)' ); 上面的代码片段展示了 ~> 和 |=> 这两个由 pg_durable 定义的 特殊运算符 ",它们分别用于实现节点的顺序执行以及将结果绑定到变量。df.start 函数用于启动持久化函数的执行。下面的示例演示了如何并行执行两个节点,并使用 df.join 函数(或与其等效的 & 运算符)等待它们完成: df.join('SELECT count(*) FROM a', 'SELECT count(*) FROM b')\ 'SELECT 1' & 'SELECT 2' 微软将该扩展定位于向量嵌入管道场景,其中,数据需分块处理、发送至嵌入 API,然后写入 pgvector;同时也适用于计划维护任务,例如检测数据膨胀、触发通知、等待审批以及执行后续操作。此外,该扩展还适用于依赖外部 API 的工作流。 从架构上讲,pg_durable 刻意保持了极简设计,它仅包含一个 Postgres 扩展以及一个后台工作进程,而不包含任何外部控制平面。负责运行持久化函数的工作进程基于两个 Rust 库构建:duroxide 提供编排运行时,包括确定性重放、检查点、子编排和定时器;duroxide-pg 则将实例、历史记录、工作队列及其他运行时状态持久化存储在由 duroxide 提供的专用模式中。 持久化执行是一种软件范式,它使长期运行的工作流能够从故障点自动恢复,省去了复杂的手动状态恢复过程。该模型简化了分布式系统,有助于构建健壮的代理架构和云控制平面。InfoQ 之前曾经发文探讨过 Temporal " 和 Cloudflare " 等平台所支持的持久化执行技术。 原文链接: https://www.infoq.com/news/2026/06/postgresql-pg-durable/ "