BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース GraphQLデータフェデレーションを実装したHasura Remote Joins

GraphQLデータフェデレーションを実装したHasura Remote Joins

ブックマーク

原文(投稿日:2020/12/16)へのリンク

Hasura Remote Joinsは、単一のデータグラフによる複数の下位データソースへのクエリを可能にする。そのために連合する(federated)データソースを修正する必要はなく、連合するデータモデル間のリレーションを設定すればよい。Unified GraphQL APIをHasuraの認証処理、キャッシング処理と組み合わせれば、さらに一貫性のある、セキュアなデータアクセスを大規模に実現することが可能になる。

データソースはGraphQLREST、SQL serverなど、さまざまなインターフェースによって公開される。HasuraのWebサイトには、フェデレーション(連合)の動作方法についての説明がある。図中のUnified GraphQLクエリには、複数のリモートソースからのデータ項目が含まれる(profileのidnameはPostgresデータベースから、adressesはRESTリソースから)。

複数ソースからのデータを対象とするGraphQLクエリ

Hasuraは両方のデータソースに対して並列的にクエリを行い、受け取ったデータを連合する。

両ソースにより受信したデータの連合

Remote Joinsは、SQLテーブルのローカルでの結合(join)のコンセプトを、GraphQLスキーマの任意の部分に対するデータの結合が可能なように汎化(generalize)するものだ。開発者に慎重な命令型コードの記述を求めるスキーマスティッチング(shema stitching)とは違い、Remote Joinsは宣言型アプローチに従っている。開発者はまず、外部データソースをリモートスキーマとして設定する。その上で、テーブルのカラムからリモートスキーマのフィールドへの結合を専用のUIで設定するのだ。

remote-rel-configuration
(出典: Hasura 1.3 release note)

Hasuraのブログには、Remote Joinsを実際のアプリケーションで使用する方法についての説明がある。

EコマースのWebサイトであれば、ユーザの注文ページ上のデータを、PostgresとStripeから1回のクエリで取得することが可能になります。あるいは、複数ドメインのデータベースに対して、それらをまたがる結合を、通常のテーブル結合と同じように行うことができます。

データの連合の他に、Remote Joinsには、パフォーマンスやセキュリティ、一貫性といった面でのメリットもある。Hasuraは効率のよい実行プランを生成することで、下位ソースに関連する処理の大半を軽減してくれる。リモートスキーマをバッチコールしてn+1問題を回避することも可能だ。セキュリティの面では、ロールベースのアクセス管理をリモートスキーマに拡張する。Hasuraはセッション変数をフォワードするので、それを使って独自の認証処理を実装することが可能になる。

Remote Joinのドキュメントはオンラインで公開されている。Hasura Con 2020ではTirumarai Selvan氏が、Remote Joinsを紹介する講演を行っている("Using Remote Joins to Create a Unified GraphQL API for Your Company")。

Hasura GraphQL Engineは2018年にオープンソースとして公開されており、既存のPostgresアプリケーション上にGraphQLエンドポイントをセットアップすることが可能である。Hasuraが強調するのは、開発者の生産性とパフォーマンスだ。既存のPostgresデータベースを参照することにより、Webサーバを数分で宣言的に設定して、運用レベルのAPIを公開することが可能になる。

Hasuraエンジンにはイベントトリガも備わっているので、マイクロサービスやサーバレス関数を使って付加的な処理を行うことができる。GraphQLクエリの深さに制限はなく、単一のSQLクエリにコンパイルが可能だ。

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

BT