シンガポールのSupabaseは、GraphQLを用いてデータベースクエリを実行できるようにする、PostgreSQL拡張機能pg_graphqlの最新バージョンとなる「pg_graphql 1.0」の一般提供を、12月16日(現地時間)に開始した。
pg_graphqlは、1GBのメモリを搭載したサーバで実行されている、Supabaseの無料枠において、可能な限り省メモリで動作することを目指して開発されている。
開発の初期段階では、GraphQLをSQLに変換するための、C言語で記述されたパーサを備え、PostgRESTのRPC機能を使用して唯一のSQL関数であるgraphql.resolve(...)を、HTTP経由で公開するアプローチが採用された。
データは、標準的な特権のないSQL関数を通じてアクセスされるので、Postgresロールのパーミッションと行レベルセキュリティ(RLS)ポリシーは、Postgresの場合とまったく同じように機能する。セキュリティモデルは一度定義すると、SQL、REST、Realtime、GraphQLなど、あらゆる場所に適用される。
また、個別のプロセスを持たないため、ラウンドトリップ時間がなく、データベースのスキーマ検査は、キャッシュを必要とせず常に同期している。
pg_graphqlのパフォーマンスは、データベースのサイズに比例し、ユーザーのパフォーマンスのニーズが増加した場合、データベースインスタンスをアップグレードすることで、外部プロセスを管理することなくGraphQLのスループットも向上させられる。
なお、GraphQL APIを通じて、原子性、一貫性、独立性、永続性が保証されるため、マルチミューテーションGraphQLリクエストの一部が失敗した場合、リクエスト全体をロールバックしてデータベースを一貫した状態に保つことができる。
pg_graphqlは、バージョン0.5.0から純粋なRustプロジェクトとして書き直されており、コードベースがより保守しやすい状態にリファクタリングされ、開発スピードが向上するとともに、パフォーマンスの大幅な向上を実現した。
今回、リリースされたバージョン1.0の時点で、pg_graphqlの導入によるオーバーヘッドはSupabaseの無料枠が実行されているハードウェアにおいて、リクエストあたり300μ秒未満で、SQLから実行すると接続ごとに1秒あたり最大1060クエリが表示される。Auth+HTTPスタック全体では、無料利用枠は1秒あたり最大645のリクエストを処理可能であり、より大きなインスタンスではスタックが1秒あたり10000リクエスト以上を処理できる。
「pg_graphql 1.0」は、安定性に関しては重要なマイルストーンではあるものの、機能を拡張する余地はまだ十分にあり、今後のロードマップで追加が求められている機能としては、
- String型のためのstartsWithやネスト可能なand/orブロックといった拡張フィルタリングオプション
- ユーザー定義関数のサポート
- ビューのサポート
が挙げられる。また、長期的には移行用のAPI、supabase/wrappersによるサードパーティサービスとの統合、サブスクリプション用のスケーラブルなソリューションといった、より野心的な機能の実装も検討している。
この記事は参考になりましたか?
- この記事の著者
-
CodeZine編集部(コードジンヘンシュウブ)
CodeZineは、株式会社翔泳社が運営するソフトウェア開発者向けのWebメディアです。「デベロッパーの成長と課題解決に貢献するメディア」をコンセプトに、現場で役立つ最新情報を日々お届けします。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です