Nginx のイベントループ
HTTP、WebSocket、ノンブロッキングのデータベース I/O が Nginx のイベントループを共有します。
SQL 中心のバックエンド アルファ
PostgreSQL 関数を HTTP で公開し、変更通知を WebSocket で送る Nginx 向け Rust モジュールです。
GitHubHTTP、WebSocket、ノンブロッキングのデータベース I/O が Nginx のイベントループを共有します。
プリペアドステートメントとパイプライン処理により、繰り返し処理とデータベースへの往復を減らします。
PostgreSQL の JSONB レスポンステキストをそのまま転送します。出力検証を無効にすると、レスポンス JSON の解析も省けます。
パッチ適用済み libpq のビルドでは、条件を満たすリクエストの本文を Rust と libpq にコピーせずに扱います。自動的なバッファ借用は、平文のデータベース接続を使う条件に合った大きなリクエストに適用されます。標準ビルドは引き続きコピーします。
上記ベンチマークではコピーするバッファを使用しました。レスポンスと TLS には引き続きコピーが伴います。
# 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;SQL 関数は JSON を受け取り、JSON を返します。クエリ、業務ルール、認可を処理します。
API で公開する関数を宣言します。pgxio は JWT を検証し、各関数をトランザクション内で呼び出します。
認可された WebSocket 購読が変更を通知します。クライアントは HTTP で現在のスナップショットを再取得します。
購読が届けるのは変更の通知であり、永続的なイベントログではありません。再接続後、クライアントは再購読して最新のスナップショットを取得します。
既存の pgxio チェックアウトからこれらのコマンドを実行します。Docker Compose と Python 3.9 以降が必要です。
付属の開発環境は localhost にバインドします。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 '{}'