pg_durable
在 PostgreSQL 中使用 SQL 定义可持久化、可恢复的长时间运行函数
仓库
microsoft/pg_durable
https://github.com/microsoft/pg_durable
源码
pg_durable-0.2.3.tar.gz
pg_durable-0.2.3.tar.gz
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
pg_durable | 0.2.3 | FEAT | PostgreSQL | Rust |
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 2870 | pg_durable | 否 | 是 | 是 | 是 | 否 | 否 | df |
Requires shared_preload_libraries=pg_durable and a superuser worker role.
版本
| 类型 | 仓库 | 版本 | PG 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | PIGSTY | 0.2.3 | 1817161514 | pg_durable | - |
| RPM | PIGSTY | 0.2.3 | 1817161514 | pg_durable_$v | - |
| DEB | PIGSTY | 0.2.3 | 1817161514 | postgresql-$v-pg-durable | - |
构建
您可以使用 pig build 命令构建 pg_durable 扩展的 RPM / DEB 包:
pig build pkg pg_durable # 构建 RPM / DEB 包
安装
您可以直接安装 pg_durable 扩展包的预置二进制包,首先确保 PGDG 和 PIGSTY 仓库已经添加并启用:
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或更早版本升级后保留duroxide。df.duroxide_schema()报告当前活动的模式。 - 深度超过256级或节点数大于10,000的工作流被拒绝。条件查询返回空行时评估为假。
- 在执行
df.grant_usage()后重新运行ALTER EXTENSION ... UPDATE,因为所有函数上的权限不会自动包含后来添加的函数。 {name}变量替换是原始SQL文本替换;不要将不可信输入放置在这样的变量中。通过$name进行命名步骤结果替换执行SQL转义。df.http()可用性和出站策略是编译时特性。其限制不会对任意SQL或其他已安装的扩展进行沙盒化。- 上游将该项目标记为预览版,发布的v0.2.3 Docker镜像用于评估和学习而非生产环境。