微软开源用于数据库内持久执行的 PostgreSQL 扩展

微软最近开源了一款名为pg_durable的PostgreSQL扩展,它支持在数据库内部原生运行持久化工作流,无需依赖外部编排系统。该扩展使开发人员能够直接定义和管理SQL函数的执行,包括重试、扇出和恢复等执行相关的问题。借助pg_durable,工作流可以直接在SQL中定义,而无需依赖外部应用程序。

--91likeyou---

借助 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 提供的专用模式中。

持久化执行是一种软件范式,它使长期运行的工作流能够从故障点自动恢复,省去了复杂的手动状态恢复过程。该模型简化了分布式系统,有助于构建健壮的代理架构和云控制平面。 之前曾经发文探讨过 Temporal 和 Cloudflare 等平台所支持的持久化执行技术。

🔥 热词:#微软开发的数据库 · #微软开发的数据库软件有哪些 · #微软公司提出的开放式数据库 · #微软开源软件 · #微软开源工具 · #微软开源社区 · #微软开源项目 · #微软开源ide