Hasura Remote Joinsは、単一のデータグラフによる複数の下位データソースへのクエリを可能にする。そのために連合する(federated)データソースを修正する必要はなく、連合するデータモデル間のリレーションを設定すればよい。Unified GraphQL APIをHasuraの認証処理、キャッシング処理と組み合わせれば、さらに一貫性のある、セキュアなデータアクセスを大規模に実現することが可能になる。
データソースはGraphQL、REST、SQL serverなど、さまざまなインターフェースによって公開される。HasuraのWebサイトには、フェデレーション(連合)の動作方法についての説明がある。図中のUnified GraphQLクエリには、複数のリモートソースからのデータ項目が含まれる(profileのid
とname
はPostgresデータベースから、adresses
はRESTリソースから)。
Hasuraは両方のデータソースに対して並列的にクエリを行い、受け取ったデータを連合する。
Remote Joinsは、SQLテーブルのローカルでの結合(join)のコンセプトを、GraphQLスキーマの任意の部分に対するデータの結合が可能なように汎化(generalize)するものだ。開発者に慎重な命令型コードの記述を求めるスキーマスティッチング(shema stitching)とは違い、Remote Joinsは宣言型アプローチに従っている。開発者はまず、外部データソースをリモートスキーマとして設定する。その上で、テーブルのカラムからリモートスキーマのフィールドへの結合を専用のUIで設定するのだ。
(出典: 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クエリにコンパイルが可能だ。