REST、gRPC、および GraphQL を使い分ける (パート 2)

パート 1 では、最も人気のある 2 つの API モデル、REST と gRPC の長所と短所を説明しました。

パート 2 では、3 つ目の API モデルである GraphQL を取り上げます。そして、最後に、REST、gRPC、GraphQL を並べて比較し、本シリーズの内容を振り返ります。

GraphQL

GraphQL は、モバイル アプリケーション向けに、合理的でクエリ可能な API を提供するために設計された API クエリ言語です。GraphQL API は、非常に複雑なスキーマのデータのサブセットのみを必要とする実装において人気があります。

GraphQL を理解するには、リクエストとレスポンスの例を見るのが簡単です。国リストの GraphQL 実装について考えてみましょう。この API は大陸と国をリソースとしています。リクエストとレスポンスの例を見てみましょう。

左側 (リクエスト) では、API から受け取るフィールドを指定する必要があります。取得するフィールドを指定せずに、すべての大陸をリクエストするオプションはありません。上記のリクエストでは、各大陸の name (名前) と code (コード) を要求しています。

name を要求せずに code だけを要求すると、レスポンス ペイロードは小さくなります。この例ではわずかな利点しか得られませんが、数十ものカラムからなる大きなテーブルでは大きな利点が得られます。REST API では、GET リクエストはすべてのレコードのすべてのフィールドを取得します。GraphQL では、クライアントは必要な情報のみ取得して処理します。

別の例として、国のクエリで利用可能なフィールドを見てみましょう。


ネイティブ GraphQL サポートを使用して Kong Insomnia でフェッチされた国リソースのフィールド

次のクエリは、ヨーロッパでデンマーク クローネを通貨として使用しているすべての国の名前、首都、および言語を取得します。

以下に、レスポンス ペイロードを示します。

ご覧の通り、結果は 2 つだけですが、1 回のリクエストで結果を取得しています。GraphQL はこのようなクエリ精度ために作られたものであり、フィルタリングを最大限に活用し、レコードの特定のフィールドを選択して返します。

GraphQL の長所と短所

GraphQL では、開発者はクエリで必要なデータのみを抽出できます。

この柔軟性はクライアントにとってはメリットですが、サーバー開発者にとってはデメリットになります。サーバー側で面倒な処理を行う必要があるため、サーバーのパフォーマンスは予測できません。また、リクエストを完全にカスタマイズできるため、キャッシュが非常に困難です。そのため、GraphQL は急勾配の学習曲線を持ちます。

GraphQL のユースケース

クライアントがさまざまな方法でデータを利用することが予想される場合、GraphQL は理想的な選択肢です。API 利用者のメリットを考慮すると、バックエンドの作業が増えるかもしれませんが、API の利便性は高まります。

クライアント アプリケーションが、インターフェイスを構築したり、アプリケーションに表示される情報を生成するため、高度に構造化された情報を必要とする場合、GraphQL はサーバーへのリクエストの数を軽減する素晴らしい方法となります。

主な違いの比較

最適な API 開発アプローチを選択するには、ビジネスとアプリケーションのニーズをよく検討することから始めます。次の表は、今回紹介した 3 つのアプローチの主な違いを示しています。

まとめ

このシリーズを通して、API 開発には画一的なアプローチはないことがお分かりいただけたかと思います。マイクロサービスによって、アプリケーションの機能は他のシステムから独立して抽象化、拡張、変更されるようになりました。システムの一部が gRPC 実装を必要とする場合であっても、他の部分に GraphQL API を使用したり、REST で他のものを取得することが可能です。

上位の API モデルの詳細とそれらの使用法については、Kong 社で公開している eBook、「When to use REST versus gRPC versus GraphQL」をご覧ください。


Kong Enterprise の概要、価格、およびライセンス体系などの詳細は、こちらを参照してください。


記事参照: 2022 年 4 月 11 日
Adam Jiroun
© Kong Inc. 2022
When to Use REST vs. gRPC vs. GraphQL (Part 2)

タイトルとURLをコピーしました