ネットショップ開設にチャレンジしてみませんか?

GraphQLとAPIレート制限について

今回の記事は、ShopifyDevs YouTubeチャンネルの動画を補足するものです。これは、Shopify PlusのソリューションエンジニアであるZameer Masjedeeが作成した3回シリーズの2回目にあたります。今回は、最初の投稿「レート制限の概要」で取り上げた内容に基づいて、GraphQLのメリットを検討し、それがなぜ推奨されるのか、REST APIと何が違うのかを見ていきます。

注:記事内に出てくる画像はすべて、関連するYouTube動画のタイムスタンプにリンクされています。詳しい情報を知りたいときはクリックして動画に飛ぶことができます。

GraphQLとは?

GraphQLは、REST APIでは構造的に解消できない不備を解決するために設計されました。いくつかの事が簡略化されています。通常のRESTpostgetputdeleteといったリクエストの代わりに、GraphQLのリクエストは、query(クエリ)mutation(ミューテーション)にカテゴライズされます。

GraphQLは、REST APIでは構造的に解消できない不備を解決するために設計されました
query(クエリ)は単純にデータを読み込みます。mutation(ミューテーション)はそれ以外のすべて、つまりデータの作成、更新、削除などを担います。

GraphQLは大量の情報を問い合わせる能力に長けています。今回のチュートリアルの最初のパートとなる「レート制限の概要」で見たように、基本的にほとんどコストがかかりません。単一のオブジェクトの取得で1ポイント、標準的なミューテーションのコストが10ポイントです。

こちらも参考にしてください GraphQLを始めよう

 

GraphQLを使用するアドバンテージの1つは、関心のあるデータをREST APIで取得しようとする場合に発生するであろうHTTPリクエストの数に関係します。

例として、productを取り上げてみましょう。productIDをもっていて、すべての商品データを取得したいとします。さらに、全商品のimagesvariantsmetafieldsも取得するとなると、4つのユニークHTTPコールが発生します。わたしたちのRESTでは、すべてが個別のエンドポイントとなるからです。

これで容量の10分の1を使用し、1秒ごとの回復レートが2コールなので、回復までに2秒を要します。

GraphQLは、これとはちょっと違った働き方をします。1つのGraphQLクエリによって複数の関連オブジェクトからデータを取得することができます。以下で、そのやり方を解説します。

Shopify GraphQLアプリでの作業

わたしのデモストアに移動しましょう。すでにShopify GraphQLアプリがインストールされています。以下のようになっています。

あなたの開発ストアにも同じものをインストールする必要があります。admin環境でGraphQLをテストするのにとても役立ちます。

手早くクエリを書きましたが、ストアの最初のプロダクトであるproducts(first: 1)を確認し、このプロダクトのIDdescriptionを取得したいと思います。また、最初のバリエーションvariants(first: 1)を確認して、そのbarcodeも取得します。最後に、images(first: 1)metafields(first: 10)の情報も得ます。

このリクエストを実行するとどうなるか確認してみましょう。

要求したものだけが提供されていますね。リクエストしたIDdescriptionvariantが確認できます。バリエーションIDなどの不要な情報は含まれていません。受け取ったデータからわかるのは、過度な取得がおこなわれていないということです。要求したものだけが得られています。

RESTでは同じようにはいきません、残念ですが。もし注文IDの情報をリクエストしたら、その注文に関するすべてが返ってくることになります。350行のJSONデータが提供されます。Insomniaでは、求めるフィールドを特定するためにパラメータを渡すことができません。

RESTとは異なり、GraphQLでは変更を加えることができます。たとえば、特定の注文を取得する別のクエリを作成してみましょう。

これが、上述のInsomniaの事例と同じもの(特定の注文)を取得するためのGraphQLクエリです。ただし、必要なのは1つのプロパティのみです。データベースに入れるか同様の処理をするために、fullyPaidか否かを知りたいだけなのです。

リクエストを投げると、trueが返ってきます。fully paidということです。これを見つけるのに、利用できる1,000ポイントのうち1ポイントを使用したに過ぎず、1秒ごとに50ポイントレストアできます。

制限の状態と残り分が非常に正確に把握できます。

これで、同じようなものがREST APIのコールのときにも得られます。わたしはInsomniaを使用していますが、ほかのHTTPクライアント、たとえばPostmanなどを使っても構いません。Insomniaで作成したorderリクエストに戻りましょう。

ヘッダーのレスポンスには、x-Shop-api-call-limitというShopify特有のヘッダーを渡します。これにより、APIレート制限の使用量がわかります。

このコールを素早く数回おこなうと、レート制限が変化するのが確認できるはずです。少し時間がかかるのは、リーキーバケットのアルゴリズムによって毎秒ごとに2つのコールがレストアされるためです。ただ、APIレート制限の残り分は正確なスナップショットによって表示されます。

RESTの代わりにGraphQLを使用するメリット

GraphQLを使って作業をするもう1つの重要なメリットは、わたしたちShopifyがあなたのリクエストしているデータを理解するのに役立つという点です。

REST APIにコールをすると、わたしたちはあなたが使用しているデータとそうではないデータの区別がつきません。このことは、Shopifyとあなたの関係を把握するうえで大きな影響をもちます。GraphQLのミューテーションが使用されると、取得する特定のフィールドや特定のミューテーションについて、理解する助けになります。つまり、ベータテスターが必要な新しいプロダクトのリリースや、機能の削除があるとき、わたしたちはだれに影響があるか知っているため、直接あなたにリーチできるわけです。

ほかにもGraphQLのメリットはありますが、最後に1つ挙げたいのは、GraphQLが独自のスキーマをもっていることです。クエリとミューテーションをまとめたときに、自分が何にアクセスしたのか正確にわかります。そのため、RESTの実装でありがちな間違いやすさがありません。

基礎的な面でも、構造的な面やアーキテクチャの面でも、GraphQLの技術がもたらすメリットによって、REST APIでは不可能なことが可能になります

アーキテクチャの観点でいうと、基礎的にも構造的にもHTTPのリクエスト数と取得するデータの総量はとても重要です。それとは別に、GraphQLの技術はREST APIでは必ずしも実現できないことを可能にしてくれます。そのようなGraphQLのメリットの1つが、一括処理です。

一括処理API:GraphQL特有の能力

ShopifyにはGraphQL専用の機能がいくつかあり、それらは通常、全体的な効率性に関わるものです。RESTGraphQLかを選択する際には、その豊富な能力を積極的に取り込む姿勢も重要になってきます。

RESTかGraphQLかを選択する際には、その豊富な能力を積極的に取り込む姿勢も重要になってきます

では、一括クエリミューテーションとはなんでしょうか?

一括クエリミューテーションは、Shopifyに一連の長いタスクを実行させ、完了したら通知させる機能のことです。

あなたの側でやるべきことは次の2つです。

  1. Shopifyにクエリを与えます(その処理が完了したら通知します)
  2. データをダウンロードします

通常、一括クエリを使用しない場合は、データセットのページネーションが必要になります。たとえばRESTの場合、レスポンスで返ってくるのは250アイテムまでです。GraphQLの場合、コストベースにはなりますが、最終的にはリクエストごとに特定の数に限定されます。一括処理APIの場合は、そうではありません。

開発者ドキュメントの、GraphQL Admin APIによる一括処理のチュートリアルの例をご覧ください。

これは、数十万あるいは数百万の商品になり得ます。明らかに、処理には時間がかかりますが、最終的には全該当データ(とくにIDtitle)を含むレスポンスが得られるので、わたしたちのサーバーに保存できます。

あなたのリクエストを、Shopifyが処理します。ステータスが完了したら、別のエンドポイントから確認して、ファイルをダウンロードすることが可能になります。


どんなときにこの機能を使用できるのでしょうか?

おそらくあなたはデータ処理系のアプリをインストールして、マーチャントに素敵なダッシュボードを見せたいはずです。マーチャントが最初にあなたのアプリをインストールしたとき、彼らのデータを一括でダウンロードできれば、ビジネスインテリジェンス(BI)ツールを使って彼らが求めているインサイトを提供できます。

別の方法として、webhookを使用しているとしましょう。webhookのデリバリーは必ず保証されるので、便利です。Reconcile処理の実装やクローンのスケジューリングを一括ミューテーションでおこなうことができ、そうすると日々、前日の注文をすべて取得するといったことが可能です。

上述の例では、全商品を取得していますが、ほかのパラメータを渡すことも簡単にできます。では、特定の日に作成されたデータだけを取得したいとしましょう。すべてのwebhookを受け取ったかどうかを問わず、包括的なデータのリストが入手できることがわかると思います。

一括処理で在庫アイテムを更新する

もう1つの優れた使用例が、inventoryBulkAdjustQuantityAtLocationミューテーションです。舌をかみそうな長い名称ですが、かなり使えます。

1つのミューテーションの単一ロケーションにおいて、最大100件の異なる在庫アイテムを更新可能です。RESTの場合、各在庫レベルで1つのコールとなるので、100件の更新で100コール。GraphQLなら、1,000ポイントの容量また50のレストアレートのうち、1つのミューテーションで10ポイントしか使用しません。

GraphQLでビルドする

ここまで見てきたように、GraphQLには多くのメリットがあり、とくに複数の拠点をもっていたり、在庫に影響するファクターをもつユーザーのために作業するときなど、ほかのシステムとShopifyを同期させたい場合に有益です。より効率的でスケーラブルなリクエストはGraphQLにフォーカスされているため、さらに深掘りする価値があります。

このシリーズの最後の動画をShopifyDevs YouTubeチャンネルでチェックしてください。Rubyアプリケーションを用いてShopify API gemにコールし、APIのリアルな制限を検証します。

原文:Zameer Masjedee 翻訳:深津望

 

よくある質問


GraphQLとは


GraphQLはAPI向けに作られたクエリ言語で、REST APIでは構造的に解消できない不備を解決するために設計されました。

Shopifyで一括処理は可能ですか

はい、一括クエリミューテーションで一連の長いタスクを実行させ、完了したら通知させることができます。

ネットショップを開設しよう!

14日間のShopify無料トライアルはこちら

トピック: