Kōhei Yamamoto

GraphQL開発のベストプラクティスをまとめた"Principled GraphQL"を読んだ

“Principled GraphQL”はApollo社が公開しているGraphQL開発のベストプラクティス集です。

背景として、近年のアプリケーション開発では「データグラフ」が重要になってきているとしています。GraphQLを通じて、ある企業のすべてのアプリのデータとサービスとを統合してデータグラフとして提供することで、クライアントとしてのアプリケーションから効率よく簡単にサービスを使うことができるようになります。もはやGraphQLはクエリ言語というより、クライアントとサービス間の接続を担う包括的なソリューションなので、いろいろと考えるべきことも多く、GraphQL開発の統合環境を提供していて経験豊富なApolloがベストプラクティスをまとめた、というところのようです。

実際のところ最近GraphQLを触っていないのですが、ざっくり読んでみました。


構成

ドキュメントのフォーマットは”the Twelve-Factor App”に影響を受けていて、各項目では守るべき原則を表す簡潔なタイトルとリード文に続いて、具体的な説明が載る構成。ただし”Principled GraphQL”は10箇条であり、次の3件にカテゴリ分けされている。

Integrity Principles

One Graph

例えば、ある会社がジャンルの違う複数サービスを持っている場合は、それらの既存のREST APIなどをApolloプロダクトでデータグラフとして統合すべき、という意図と読める。

Federated Implementation

Apollo Federationでバックエンドの違いは吸収できる。“One Graph”と表裏一体の関係にあるような原則。

Track the Schema in a Registry

schema registryはApolloの場合The schema registryのこと。知らなかったが便利そう。

Agility Principles

Abstract, Demand-Oriented Schema

インタフェースを設けることでバックエンドのアーキテクチャ変更も理論的には可能になるというのはソフトウェアエンジニアリングで頻出なので、もはや一般的な原則という感じもする。

Use an Agile Approach to Schema Development

Apolloだと@deprecatedディレクティブがある。

Iteratively Improve Performance

GraphQLはエンドポイントが一つで従来のAPMが使いづらいので、パフォーマンス監視のために後述するtracerがあったほうがよさそう。

Use Graph Metadata to Empower Developers

型のついたスキーマを使うと補完が捗りそうというのは容易に想像がつく。GraphQLはクエリのコストを気にする必要があるので、そこへの対策もここで入ってくる。

Operations Principles

Access and Demand Control

GraphQL APIを公開するときはもちろん、内部的なAPIとして使うときも意図せずクエリのコストが高くなることはあるだろうと考えられるので、とにかく実行されるクエリの管理やコストの事前計測が大事そう。

Structured Logging

Separate the GraphQL Layer from the Service Layer

REST APIにおけるAPI Gatewayのような役割。Apollo FederationにおけるGatewayがここで述べられている層の役割の一部を担っている。


感想

スキーマの活用が便利というのはもちろんのこと、クエリのコストについてさまざまな方法で十分な注意を払うべきという主張がなされているのは興味深かったです。原則を示しつつ、Apolloがそれに対応するツールを用意しているところが強いなという印象でした。

興味があるかたは読んでみてください。