SQL 中心のバックエンド アルファ

高速な PostgreSQL API。
少ないメモリ使用量。

PostgreSQL 関数を HTTP で公開し、変更通知を WebSocket で送る Nginx 向け Rust モジュールです。

GitHub

pgxio がオーバーヘッドを減らす仕組み

Nginx のイベントループ

HTTP、WebSocket、ノンブロッキングのデータベース I/O が Nginx のイベントループを共有します。

データベース接続の再利用

プリペアドステートメントとパイプライン処理により、繰り返し処理とデータベースへの往復を減らします。

JSON の再シリアライズなし

PostgreSQL の JSONB レスポンステキストをそのまま転送します。出力検証を無効にすると、レスポンス JSON の解析も省けます。

ゼロコピーでのリクエスト転送 実験的

パッチ適用済み libpq のビルドでは、条件を満たすリクエストの本文を Rust と libpq にコピーせずに扱います。自動的なバッファ借用は、平文のデータベース接続を使う条件に合った大きなリクエストに適用されます。標準ビルドは引き続きコピーします。

上記ベンチマークではコピーするバッファを使用しました。レスポンスと TLS には引き続きコピーが伴います。

仕組み

pgxio.conf設定の抜粋
# HTTP endpoints
pgxio_endpoint list_tasks
  web.list_tasks read_only;

pgxio_endpoint create_task
  web.create_task;

# WebSocket subscription authorization
pgxio_stream tasks
  web.authorize_tasks;
  1. 01

    SQL 関数を書く

    SQL 関数は JSON を受け取り、JSON を返します。クエリ、業務ルール、認可を処理します。

  2. 02

    エンドポイントを明示的に公開する

    API で公開する関数を宣言します。pgxio は JWT を検証し、各関数をトランザクション内で呼び出します。

  3. 03

    変更を購読する

    認可された WebSocket 購読が変更を通知します。クライアントは HTTP で現在のスナップショットを再取得します。

ブラウザ / クライアントHTTP + WebSocket
Nginx 内の pgxioRust + ノンブロッキング libpq
PostgreSQL関数 + 通知

購読が届けるのは変更の通知であり、永続的なイベントログではありません。再接続後、クライアントは再購読して最新のスナップショットを取得します。

ローカルで実行

既存の pgxio チェックアウトからこれらのコマンドを実行します。Docker Compose と Python 3.9 以降が必要です。

付属の開発環境は localhost にバインドします。pgxio はアルファ版で、この設定はローカルでの試用向けです。

ターミナル · pgxio のチェックアウト内で実行
bin/pgxio init
bin/pgxio up
TOKEN=$(bin/pgxio token alice)

curl http://localhost:8080/v1/create_task \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"title":"Hello from pgxio"}'

curl http://localhost:8080/v1/list_tasks \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{}'