pg_durable

在 PostgreSQL 中使用 SQL 定义可持久化、可恢复的长时间运行函数

概览

扩展包名版本分类许可证语言
pg_durable0.2.3FEATPostgreSQLRust
ID扩展名BinLibLoadCreateTrustReloc模式
2870pg_durabledf

Requires shared_preload_libraries=pg_durable and a superuser worker role.

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.2.31817161514pg_durable-
RPMPIGSTY0.2.31817161514pg_durable_$v-
DEBPIGSTY0.2.31817161514postgresql-$v-pg-durable-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
d13.x86_64
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
d13.aarch64
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
u22.x86_64
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
u22.aarch64
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
u24.x86_64
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
u24.aarch64
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
u26.x86_64
u26.aarch64
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3

构建

您可以使用 pig build 命令构建 pg_durable 扩展的 RPM / DEB 包:

pig build pkg pg_durable         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_durable 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_durable;          # 当前活跃 PG 版本安装
pig ext install -y pg_durable -v 18  # PG 18
pig ext install -y pg_durable -v 17  # PG 17
pig ext install -y pg_durable -v 16  # PG 16
pig ext install -y pg_durable -v 15  # PG 15
pig ext install -y pg_durable -v 14  # PG 14
dnf install -y pg_durable_18       # PG 18
dnf install -y pg_durable_17       # PG 17
dnf install -y pg_durable_16       # PG 16
dnf install -y pg_durable_15       # PG 15
dnf install -y pg_durable_14       # PG 14
apt install -y postgresql-18-pg-durable   # PG 18
apt install -y postgresql-17-pg-durable   # PG 17
apt install -y postgresql-16-pg-durable   # PG 16
apt install -y postgresql-15-pg-durable   # PG 15
apt install -y postgresql-14-pg-durable   # PG 14

预加载配置

shared_preload_libraries = 'pg_durable';

创建扩展

CREATE EXTENSION pg_durable;

用法

来源:

pg_durable 在PostgreSQL中运行持久、容错的SQL工作流。一个工作流是一系列SQL步骤、定时器、信号、条件和并行分支组成的图,通过df.start()提交。执行状态会在PostgreSQL中进行检查点记录,因此在崩溃、重启或重试后不会重复已完成的步骤。

启用和授权访问

预加载工作进程,如果默认设置不合适,则选择其数据库和超级用户角色,然后重启PostgreSQL:

shared_preload_libraries = 'pg_durable'
pg_durable.database = 'postgres'
pg_durable.worker_role = 'postgres'

pg_durable.database中创建扩展,并授予应用程序登录角色访问权限:

CREATE EXTENSION pg_durable;
SELECT df.grant_usage('app_role');

工作进程角色必须是超级用户,因为它会管理所有用户的实例并绕过行级安全。调用df.start()的角色必须具有LOGIN权限,因为工作流SQL是通过该捕获角色认证的连接执行的。

构建和运行一个工作流

SELECT df.start(
    'SELECT 100 AS amount' |=> 'total'
    ~> 'SELECT $total.amount * 2 AS doubled',
    'double-total'
);

df.start()返回实例ID。使用它来监控或控制运行:

SELECT df.status('a1b2c3d4');
SELECT df.result('a1b2c3d4');
SELECT * FROM df.instance_nodes('a1b2c3d4');
SELECT * FROM df.instance_executions('a1b2c3d4', 20);
SELECT df.cancel('a1b2c3d4', 'No longer needed');

DSL索引

  • ~> 用于序列化步骤;|=>$name$name.column$name.* 替换命名结果。
  • & / df.join() 等待并行分支;| / df.race() 保留第一个结果。
  • ?>!> / df.if() 选择条件分支;@> / df.loop() 重复一个图。
  • df.sleep()df.wait_for_schedule()df.wait_for_signal() 使等待持久化。
  • df.signal()df.wait_for_completion()df.explain() 及实例检查函数操作正在运行或存储的实例。
  • df.setvar()df.getvar()df.unsetvar()df.clearvars() 管理在调用df.start()时捕获的用户变量。

v0.2.3边界

  • 新鲜安装v0.2.3将提供程序对象放置在_duroxide中;从0.2.2或更早版本升级后保留duroxidedf.duroxide_schema()报告当前活动的模式。
  • 深度超过256级或节点数大于10,000的工作流被拒绝。条件查询返回空行时评估为假。
  • 在执行df.grant_usage()后重新运行ALTER EXTENSION ... UPDATE,因为所有函数上的权限不会自动包含后来添加的函数。
  • {name}变量替换是原始SQL文本替换;不要将不可信输入放置在这样的变量中。通过$name进行命名步骤结果替换执行SQL转义。
  • df.http()可用性和出站策略是编译时特性。其限制不会对任意SQL或其他已安装的扩展进行沙盒化。
  • 上游将该项目标记为预览版,发布的v0.2.3 Docker镜像用于评估和学习而非生产环境。