RESTからGraphSQLへの移行


導入


GraphQL 企業やベンチャー企業のアプリケーションデータ層の牽引力を増してきた.歴史的に、ウェブはREST and SOAP Apisは長年にわたって彼らの目的をうまく果たしました、しかし、アプリケーションがより複雑になって、データがより豊かになったので、これらの解決は速くすぐにパフォーマーソフトウェアを開発する際に摩擦を引き起こしました.
本稿では、従来のAPIソリューションの問題点、GraphSQLへの移行のメリット、およびGraphSQLソリューションへの移行戦略について簡単に議論します.

伝統的なAPI問題


伝統的なAPIシステムでは、一般的にいくつかの問題があります.
  • フェッチまたはN + 1フェッチ中のデータ
  • フェッチするデータ
  • オールオアナッシング
  • バッチサポートの不足
  • フェッチ中のデータ


    伝統的なリソースは、私たちに、1つの実体に基づいてデータを要求するのを必要とします.たとえば、RESTを使用する場合、ユーザーの詳細とその投稿を取得したい場合は、次の要求を行います.
  • GET /users/1
  • GET /users/1/posts
  • フェッチするデータ


    逆に、私たちが特定のデータを要求するとき、それは我々が気にしないかもしれないデータを含むすべての利用可能な情報を与える.以前の例では、ユーザの名前とユーザ名だけが欲しいかもしれませんが、応答は我々の作成時間とバイオを与えてくれるかもしれません.

    オールオアナッシング


    しかし、このプロセスのどこかにエラーがあれば、データを取得しないかもしれません.代わりに、エラーメッセージを持つ失敗を通知するHTTPステータスコードを受け取ります.

    バッチサポートの不足


    最後に、より複雑なページでは、並列化することができる複数のリクエストを実行する必要があるかもしれませんが、従来のAPIではこの動作をサポートしていません.ダッシュボードは、例えば、我々のクライアントが我々のサーバーに2つの別々の要求をするのを必要とする販売とマーケティングデータを必要とするかもしれません、そして、そのデータを我々のアプリケーションで知覚されたスローネスを引き起こしていることを表示する前に結果を待ちます.

    GraphSQLの利点


    ボックスから、GraphSQLは、宣言宣言のクエリとデータ処理のためにこれらの記述された問題のすべてを解決します.データを取得するときは、必要な正確なデータを要求し、エンティティ間の接続を使用して、単一の要求でそれらの関係を取得できます.データのいずれかが取得しない場合、GraphSQLはまだ正常に取得されたデータと他のデータを取得する際の失敗について教えてくれます.Graphqlはまた、単一の要求で複数の操作をグループ化し、単一の要求からすべてのデータを取得することができます、このようにあなたのサーバーへのラウンドトリップの数を減らし、あなたのアプリケーションの知覚速度を増加させる.
    これらの機能に加えて、GraphSQLはクライアントのための単一のゲートウェイを作成し、データの取得方法についてチームコミュニケーションの摩擦を減らします.あなたのAPIはすぐにそれを使用する方法についてのドキュメントを提供する単一のエンドポイントの後ろに離れて抽象化されます.

    すべてのこれらの利点を考えると、チームがGraphqlに動いているのは不思議ではない.

    移行戦略


    GraphSQLマイグレーション戦略はインクリメントされます.したがって、既存のデータに対するポートへの展開を遅くする必要がなくなります.

    0 .はじめに


    あなたが移行を始める前に、あなたが新しい特徴を構築しているか、どんな方法ででもシステムを修正しているので、考えるために、若干の提案はここにあります.
    任意の新しい残りのエンドポイントを構築しないでください.どんな新しいREST仕事も後の追加のGraphical仕事であるでしょう.自分で好意的にして、既にGraphSQLでビルドします.
    現在の残りのエンドポイントを維持しないでください.残りのエンドポイントをGraphelに移植することは簡単です、そして、Graphqlはあなたが望む正確な行動を構築するために、より多くの機能を提供します.
    レバレッジ既存の残りの部分を迅速にプロトタイプに.既存のREST APIを使用して、GraphSQLの実装に対応できます.これは持続的であるか演奏者に長期的でないでしょう、しかし、始めるのはすばらしい方法です.

    1 . GraphSQLの実装


    Apollo and Relay 2つの最も人気のあるfullstackのグラフィカルなソリューションですが、また、独自のソリューションを構築することができます.あなたが使用するものに関係なく、あなたはサーバーエンドポイントを実装して、あなたのクライアントとそれに接続するためにこれを使用します.すべてのGraphSQLの要求は、単一のエンドポイントを通過するので、一度これが稼働している場合は、それに接続することができますし、移植機能を開始します.

    2 .ビルドまたはポートの最初の機能を選択します


    当社のサーバーでは、我々はそれに追加を開始することができます.前の例に続いて、ユーザー投稿を移行しましょう.

    3 .スキーマタイプの定義


    ユーザー投稿について決定しましたが、ここで2つのルートがあります.(1)ユーザーと投稿を移動する、または(2)ユーザーにフィルタを移動させる.これのために、私たちは今、ユーザーIDの上でポストとフィルタを移行するつもりです.出発するには、我々の定義post スキーマの型を指定し、クエリの型を定義します
    type Post {
      id: ID!
      userId: ID!
      content: String!
    }
    
    type Query {
      posts(userId: ID): [Post]
    }
    
    我々は今Post IDと内容を持つ型で、どのユーザーが属しているかを知ることができます.追加的に、私たちはPosts オプションでユーザIDをフィルタとして受け取り、Post s .それを暴露するために、それがGraphqlで意味的に正しくないことに注意するのは重要ですuserId フィールドとして.代わりに、ユーザーにポストを接続し、そのエンティティ関係を公開する必要がありますが、これらはあなたのAPIをデザインするように選択されます.

    4 .データレゾルバをビルドする


    さて、スキーマタイプとクエリをデータに接続する必要があります.このために、リゾルバを使用します.以下の構文は、サーバの実装に対して少しずつ変更されますが、JavaScriptとGraphSQLの仕様を使用すると、以下のリゾルバオブジェクトに終わります.
    const fetch = require('node-fetch');
    
    export const resolvers = {
      Query: {
        posts: async (obj, args, context) => {
          const { API_URL } = process.env;
          const { userId } = args;
    
          if (userId){
            const response = await fetch (`${API_URL}/users/${userId}/posts`);
            return await response.json();
          }
    
          const response = await fetch (`${API_URL}/posts`);
          return await response.json();
        },
      }
    };
    
    If the userId クエリ引数には、既存のREST APIを使用して投稿を取得しますが、userId が提供されている場合、posts 直接ルート.さて、フロントエンド上のデータを取得するには、次の要求を行うことができます.
    query UserPosts($userId: ID!) {
      posts(userId: $userId) {
        id
        content
      }
    }
    
    使用を選択node-fetch 私の実装では簡単だったが、任意のHTTPライブラリを使用することができます.しかし、アポロ生態系にいるなら、彼らはRESTDataSource レゾルバをマイクロサービスAPIに処理するためのあなたのGraphSQL実装への拡張を作成し、そのサービスのためのボイラープレートを設定することができます.

    次の手順


    グラフの拡張


    データを統合したので、関連する型を接続することでグラフを完成する必要があります.の代わりにPost を持つuserId , それはUser と同じクエリから直接著者の詳細を取得します.
    query UserPosts($userId: ID!) {
      posts(userId: $userId) {
        id
        content
        user {
          id
          avatarUrl
          displayName
        }
      }
    }
    

    モノリス


    私たちは今、私たちのスキーマの完全な制御を使用してクエリと種類を持っているので、我々はいくつかの追加のperfromance利点を与える私たちのREST APIの抽象化ではなく、CodeBaseに依存するためにリゾルバ機能を更新することができます.我々は新しいタイプを縫い合わせ続けることができ、さらにAPIを拡張することができます.

    マイクロサービス


    GraphSQLとMicroServiceは手でかなり手に入ります.GraphSQLは、スキーマのステッチをサポートしています.これは、個々のGraphSQL APIをMicroServiceに構築し、それらを結合してより大きなインターフェイスを構成します.今、私たちのクライアントを構成する別のサービスへのすべての異なる接続を定義する代わりに、我々のGraphSQLサーバーはどこからすべてのデータを収集するには、フロントエンドの要求を完了するために必要な情報量を簡素化を理解しています.

    パフォーマンス


    GraphSQLの主な欠点は、サーバー側のオーバーフェッチ、またはN + 1の問題です.GraphSQLはデータがデータベースでどのように構造化されているかを正確には知りませんので、グラフツリーの冗長要求に対して最適化できません.しかし、GraphQL DataLoader ライブラリはここで正確に解決することです.これは、既に取得されている任意のデータを決定し、任意のサブクエリで使用するためにキャッシュをフォローします.

    結論


    すべての力で、Graphqlがコミュニティでそんなに多くの蒸気を拾っているのは不思議ではありません.それが言われて、GraphSQLは誰のためでもないか、今日、あなたのチームのための良い解決でないかもしれません.しかし、私たちが依存している多くの将来のAPIは、Graphqlをより深く利用し始めるでしょう.そして、我々は伝統的な休息から離れて傾向を見るでしょう.うまくいけば、あなたはあなたのコードベースのGraphqlの機会を見ました、そして、それはあなたのチームがより速い製品をより速く届けるのを助けます、そして、あなたは可能な移行についてのあなたのチームとの会話を持つことができます.
    このドットラボは、企業のデジタル変換の努力を実現支援に焦点を当てた現代のWebコンサルティングです.専門家の建築指導、訓練、またはコンサルティング、角度、Vue、Webコンポーネント、Graphql、ノード、バゼル、またはポリマー、訪問thisdotlabs.com .
    このドットメディアは、すべての包括的で教育的なウェブを作成することに集中します.我々は最新のイベント、ポッドキャスト、および無料のコンテンツを介して近代的なWebの進歩と最新の状態に保つ.学ぶthisdot.co .