概要
pg_durable は、PostgreSQLで耐障害性のある長時間実行SQLワークフローを実現する拡張機能。 cronジョブや外部ワーカー、キュー の複雑な連携を不要にし、SQLでワークフローを定義可能。 クラッシュや再起動後も自動で再開 し、状態管理や進捗追跡もPostgres内で完結。 Azure HorizonDB などで利用可能、追加インフラ不要。 データに近い場所で計算処理を実現するための新しい標準パターン。
pg_durableとは何か
- PostgreSQL拡張機能 として動作、外部サービス不要
- SQLでワークフローを定義 し、各ステップごとにチェックポイント保存
- クラッシュ・再起動・失敗時にも 途中から自動再開
- 耐障害性・可観測性 をPostgres単体で実現
主な利用対象者
- バックエンド/データエンジニア :データに近い場所でワークフローを管理したい場合
- DBA/SRE :再起動に耐える自動化RunbookやSQL監査性重視の運用
- AI・データパイプライン開発チーム :行単位やバッチ単位で堅牢な処理が必要な場面
コアアイデア
- pg_durable関数 はSQLステップのグラフで構成
- 各ステップごとに 耐障害チェックポイント を自動作成
- 失敗やクラッシュ時に 手動で状態を復元せずとも自動再開
想定ユースケース
- ベクトル埋め込みパイプライン :チャンク分割、API呼び出し、pgvectorへのupsert
- 大規模バッチのETL :ステージング、重複排除、変換、公開
- 定期メンテナンス :膨張検知、通知、承認待ち、次アクション実行
- ファンアウト集約 :並列クエリ実行後の結果結合
- 外部API連携 :エンリッチメント、分類、Webhook型SQL呼び出し
従来の課題と解決
- pg_cron+jobsテーブル+ワーカー 等で複雑な状態管理
- 外部オーケストレーター (Airflow, Temporal, Step Functions, Argo等)との連携コスト
- 再起動・失敗時の手動リカバリ ・部分的再実行問題
- アプリ層の並列処理による部分失敗バグ・ドリフト
- ワークフロー定義がSQL・ワーカー・キュー等に分散
アーキテクチャの変化
- ワークフロー定義がSQL内に統合
- 進捗・リトライ状態管理もPostgres内に集約
- アプリ層のワーカーやキューの削減
- df.instances等のPostgresテーブルで可視化・監査
適さないケース
- 単一SQL文で済むジョブ
- サブミリ秒単位の同期処理が必須な場合
- Postgres拡張やバックグラウンドワーカーが使えない環境
- ワークフローがPostgres外の異種システムを跨ぐ場合
- SQLステップやHTTP呼び出しに収まらない独自ロジックが主な場合
基本的な使い方
- SQLでワークフローを定義 (例:'sql1' |=> 'batch' ~> 'sql2')
- df.start()でワークフロー開始、インスタンスID取得
- 各ステップの間で自動チェックポイント
- Postgresから進捗・結果をクエリ可能
主な特徴
- 耐障害性 :状態はPostgreSQLに永続化、クラッシュ・フェイルオーバー対応
- SQLネイティブ :合成演算子で柔軟な関数定義
- データベース親和性 :スケジューリング・条件分岐・並列実行のプリミティブ
- ゼロインフラ :追加サービス不要、PostgreSQL拡張のみ
クイック例
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対応)をGitHubリリースから取得
- pg_durableをshared_preload_librariesに追加後、Postgres再起動
- CREATE EXTENSION pg_durable; で拡張有効化
- ユーザー権限付与必須 (df.grant_usage('role')等)
開発・テスト環境
- PostgreSQL 17/18, Rust (nightly), cargo-pgrx 0.16.1が必須
- VS Code Dev Container やローカル、Docker対応
- pg-start.shでローカルクラスタ初期化・起動
- E2Eテスト・回帰テスト が充実
マルチユーザー・権限管理
- 拡張インストール後は明示的にアプリケーションロールへ権限付与が必要
- RLS(行レベルセキュリティ)で各ユーザー専用のインスタンス/ノード管理
- 管理者はsuperuser権限が必須
- df.varsはユーザーごとにスコープ分離
CI/CDとテスト
- cargo fmt, clippy, ユニット/E2Eテスト、pg_regressによる自動チェック
- .github/workflows/ci.ymlでCIワークフロー管理
ドキュメントとサポート
- User Guide, MVP Guide, Examples で利用方法・内部実装を詳細解説
- GitHub Issues でバグ・要望受付(セキュリティはSECURITY.md参照)
- Microsoft Open Source Code of Conduct 準拠
内部アーキテクチャ
- pgrxで構築されたPostgreSQL拡張
- SQL DSLで関数グラフを構築、バックグラウンドワーカーでdurable実行
- Rust製ライブラリduroxide(オーケストレーション)、duroxide-pg(状態永続化)を活用
- Postgres内のdf.(DSLグラフ)、duroxide.(ランタイム状態)スキーマ
他言語での利用
- Rust, Python, Node等でdurable関数を記述したい場合 は、duroxide+duroxide-pgを直接利用可能
- pg_durableはSQLでの記述を簡易化するラッパー
現状と今後
- プレビュー版 として公開中
- 機能追加・安定化進行中、フィードバック歓迎