web-dev-qa-db-ja.com

GraphQLに不利な点はありますか?

GraphQLに関するすべての記事で、それがどれほど素晴らしいかがわかりますが、それに不利な点や欠点はありますか?ありがとうございました。

80
Dr.Nemo

短所:

  • 学ぶ必要がある GraphQLの設定方法。エコシステムはまだ急速に進化しているので、あなたは追いつく必要があります。
  • クライアントからクエリを送信する必要があります。単に文字列を送信できますが、より快適でキャッシュが必要な場合は、クライアントライブラリを使用します-> extra code
  • 事前にスキーマを定義する必要があります=> extra work結果を得る前に
  • サーバーにgraphqlエンドポイントが必要です=> 新しいライブラリまだ知らない
  • Graphqlクエリは、単純にRESTエンドポイントに行くよりもmore bytesです
  • サーバーは、クエリを解析してパラメータを確認するために、追加処理を実行する必要があります

しかし、それらはこれらによって対抗される以上のものです。

  • GraphQLは学習するのは難しくない
  • 追加のコードは数KBのみです。
  • スキーマを定義することで、後でさらに多くの作業を防ぐバグを修正し、毛深いアップグレードに耐えることができます。
  • GraphQLに切り替える人が多いので、優れたツールを使用してリッチエコシステムが開発されています
  • 本番環境で永続クエリを使用する場合(GraphQLクエリを単にIDとパラメータで置き換える)、実際にはRESTよりもバイト数が少ないを送信します
  • 着信クエリの追加処理はごくわずかです
  • APIとバックエンドの完全な分離を提供することで、バックエンドの改善点での反復を大幅に高速化できます
78
w00t

私はいくつかの重要なものを見つけました GraphQLの使用を検討している人にとっての懸念 、そしてこれまでの主なポイントは次のとおりです。

不定の深さでクエリ:GraphQLは不定の深さでクエリを実行できないため、ツリーがあり、深さを知らずにブランチを返す場合は、改ページを行う必要があります。

特定の応答構造:GraphQLでは、応答はクエリの形状と一致するため、非常に特定の構造で応答する必要がある場合は、変換レイヤーを追加して、応答の形状を変更します。

ネットワークレベルでのキャッシュ:GraphQLがHTTPで使用される一般的な方法(単一エンドポイントのPOST)のため、ネットワークレベルが難しくなります。これを解決する方法は、永続クエリを使用することです。

ファイルアップロードの処理:GraphQL仕様にはファイルのアップロードに関するものは何もありません。また、ミューテーションは引数にファイルを受け入れません。それを解決するには、他の種類のAPI(RESTなど)を使用してファイルをアップロードし、アップロードされたファイルのURLをGraphQLミューテーションに渡すか、実行コンテキストにファイルを挿入して、リゾルバー関数内にファイルを配置します。

予測不可能な実行:GraphQLの性質は、必要なフィールドを組み合わせてクエリを実行できることですが、この柔軟性は無料ではありません。パフォーマンスやN + 1クエリなど、知っておくと便利な懸念事項がいくつかあります。

超シンプルなAPI:本当にシンプルなAPIを公開するサービスがある場合、GraphQLは余分な複雑さを追加するだけなので、シンプルなREST AP​​Iは改善される可能性があります。

45
Bruno Soares

GraphQLで見られるこの最大の問題、つまり、リレーショナルデータベースで使用している場合、joinsを使用しています。

  1. いくつかのフィールドを許可/禁止できるという事実により、結合は簡単ではありません(単純ではありません)。これは余分なクエリにつながります。

  2. また、graphqlのネストされたクエリは循環クエリにつながり、サーバーをクラッシュさせるになります。特別な注意が必要です。

  3. レート制限の呼び出しは困難になりました。ユーザーは1回の呼び出しで複数のクエリを実行できるようになりました。

TIP:facebookのデータローダーを使用して、javascript/nodeの場合にクエリの数を減らします

31
aWebDeveloper

毎年改善されており、現在のところ、GraphQLの community は成長しています。その結果、以前の他の回答で強調された多くの問題に対する多くの解決策があります。しかし、企業がすべてのリソースをGraphQLに投入するのを未だに妨げていることを認めるために、いくつかの問題と解決策を示し、その後に未解決の問題を列挙したいと思います。

  • ネットワークレベルでのキャッシュ- Bruno が永続クエリであり、もちろんクライアントでキャッシュでき、データベースレベルでのキャッシュの使用を停止する人はいない、またはさらにRedis。しかしもちろん、GraphQLにはエンドポイントが1つしかなく、各クエリは異なるため、このタイプのキャッシングを行うのはRESTよりもはるかに複雑です。
  • GraphQLのネストされたクエリは循環クエリにつながり、サーバーをクラッシュさせる可能性があります-さまざまなソリューションで問題はなくなりました。それらのいくつかはリストされています ここ
  • ファイルアップロードの処理-すでに lots of solutions があります

ただし、デメリットとしてカウントできるケースがさらに2つあります。

  • ボイラープレートの過剰性(これにより、たとえば新しいクエリを作成するために、スキーマを定義する必要があります、リゾルバ、およびリゾルバ内で、GraphQL内でデータとフィールドをどのように解決するかを明示的に言い、クライアント側で、このデータに関連するフィールドだけでクエリを作成します
  • エラー処理-それは、RESTとの比較により関連していると言う必要があります。ここでは apollo で可能ですが、同時にRESTよりもはるかに複雑です
  • 認証と認可-しかし、私が言ったようにコミュニティは目覚ましい速度で増加しており、 すでにカップルofソリューション この目標に対して。

要約すると、GraphQLは特定の目標のための単なるツールであり、すべての問題に対する特効薬ではなく、もちろんRESTの代替品でもないことは確かです。

単一のエンドポイントを持ち、すべてのデータを公開することは本当に素晴らしいことです。 GraphQLで考慮すべき点は以下のとおりです。

  1. ファイルのダウンロード/アップロードの実装には注意が必要です(文字列への変換は大きなファイルには最適なオプションではない場合があります)
  2. フロントエンドとバックエンドの両方で多くの定型コードとスキーマコード。
  3. GraphQL仕様で提供されるページネーションに従ってください。
  4. フィールドの順序付けのカスタムオーダーと優先順位付けロジックを許可します。ユーザーデータと関連するグループとロールを取得する場合の例。ユーザーは、ユーザー名、グループ名、またはロール名に基づいてデータをマルチソートできます。
  5. 認証と承認は、バックエンドフレームワークに依存します。
  6. Graphqlコマンドごとに1つのクエリを実行するためのバックエンド最適化とデータベースサポートを確認してください。

また、実装後に長所を検討する必要があります。

  1. 新しいアイテムをサポートし、既存の動作を更新する非常に柔軟な。
  2. 実装された引数とカスタム順序を使用して条件を簡単に追加できます

  3. 多くのカスタムフィルターを使用し、作成する必要があるすべてのアクションを取り除きます。ユーザーは引数としてid、nameなどを持ち、フィルター処理を実行できます。さらに、ユーザー内のグループにもフィルターを適用できます。

  4. すべてのGraphQLクエリと突然変異を含むファイルを作成することにより、APIを簡単にテストできます。
  5. 突然変異は、概念を理解すれば簡単かつ簡単に実装できます。
  6. 複数の深さのデータを取得する強力な方法。
  7. VoyagerとGraphiQL UIまたはPlaygroundのサポートにより、表示と使用が簡単になります。
  8. 有効な記述方法でスキーマを定義する際の文書化の容易さ。
1
vCillusion

現時点ではgraphqlはバックエンドアーキテクチャの一部である必要があると思います。ファイルのアップロードには通常のAPIを使用します

1
user998548