今回の記事は、ShopifyDevs YouTubeチャンネルの動画を補足するものです。これは、Shopify PlusのソリューションエンジニアであるZameer Masjedeeが作成した3回シリーズの2回目にあたります。今回は、最初の投稿「レート制限の概要」で取り上げた内容に基づいて、GraphQLのメリットを検討し、それがなぜ推奨されるのか、REST APIと何が違うのかを見ていきます。
注:記事内に出てくる画像はすべて、関連するYouTube動画のタイムスタンプにリンクされています。詳しい情報を知りたいときはクリックして動画に飛ぶことができます。
GraphQLとは?
GraphQLは、REST APIでは構造的に解消できない不備を解決するために設計されました。いくつかの事が簡略化されています。通常のRESTのpost
、get
、put
、delete
といったリクエストの代わりに、GraphQLのリクエストは、query(クエリ)
かmutation(ミューテーション)
にカテゴライズされます。
GraphQLは、REST APIでは構造的に解消できない不備を解決するために設計されました
query(クエリ)
は単純にデータを読み込みます。mutation(ミューテーション)
はそれ以外のすべて、つまりデータの作成、更新、削除などを担います。GraphQLは大量の情報を問い合わせる能力に長けています。今回のチュートリアルの最初のパートとなる「レート制限の概要」で見たように、基本的にほとんどコストがかかりません。単一のオブジェクトの取得で1ポイント、標準的なミューテーションのコストが10ポイントです。
こちらも参考にしてくださいGraphQLを始めよう
GraphQLを使用するアドバンテージの1つは、関心のあるデータをREST APIで取得しようとする場合に発生するであろうHTTPリクエストの数に関係します。
例として、product
を取り上げてみましょう。product
のID
をもっていて、すべての商品データを取得したいとします。さらに、全商品のimages
、variants
、metafields
も取得するとなると、4つのユニークHTTPコールが発生します。わたしたちのRESTでは、すべてが個別のエンドポイントとなるからです。
これで容量の10分の1を使用し、1秒ごとの回復レートが2コールなので、回復までに2秒を要します。
GraphQLは、これとはちょっと違った働き方をします。1つのGraphQLクエリによって複数の関連オブジェクトからデータを取得することができます。以下で、そのやり方を解説します。
Shopifyマーチャントのためにアプリを制作する
Shopifyアプリストア向けのアプリ開発、カスタムアプリの開発サービス、ユーザーベースの成長促進、あなたが望むことがなんであれ、Shopifyパートナープログラムがその成功をサポートします。無料で登録して、教育リソース、開発者プレビュー環境、継続的な収益シェアプログラムを利用しましょう。
登録するShopify GraphQLアプリでの作業
わたしのデモストアに移動しましょう。すでにShopify GraphQLアプリがインストールされています。以下のようになっています。
あなたの開発ストアにも同じものをインストールする必要があります。admin環境でGraphQLをテストするのにとても役立ちます。
手早くクエリを書きましたが、ストアの最初のプロダクトであるproducts(first: 1)
を確認し、このプロダクトのID
とdescription
を取得したいと思います。また、最初のバリエーションvariants(first: 1)
を確認して、そのbarcode
も取得します。最後に、images(first: 1)
とmetafields(first: 10)
の情報も得ます。
このリクエストを実行するとどうなるか確認してみましょう。
要求したものだけが提供されていますね。リクエストしたID
、description
、variant
が確認できます。バリエーション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専用の機能がいくつかあり、それらは通常、全体的な効率性に関わるものです。RESTかGraphQLかを選択する際には、その豊富な能力を積極的に取り込む姿勢も重要になってきます。
RESTかGraphQLかを選択する際には、その豊富な能力を積極的に取り込む姿勢も重要になってきます
では、一括クエリミューテーションとはなんでしょうか?
一括クエリミューテーションは、Shopifyに一連の長いタスクを実行させ、完了したら通知させる機能のことです。
あなたの側でやるべきことは次の2つです。
- Shopifyにクエリを与えます(その処理が完了したら通知します)
- データをダウンロードします
通常、一括クエリを使用しない場合は、データセットのページネーションが必要になります。たとえばRESTの場合、レスポンスで返ってくるのは250アイテムまでです。GraphQLの場合、コストベースにはなりますが、最終的にはリクエストごとに特定の数に限定されます。一括処理APIの場合は、そうではありません。
開発者ドキュメントの、GraphQL Admin APIによる一括処理のチュートリアルの例をご覧ください。
これは、数十万あるいは数百万の商品になり得ます。明らかに、処理には時間がかかりますが、最終的には全該当データ(とくにID
とtitle
)を含むレスポンスが得られるので、わたしたちのサーバーに保存できます。
あなたのリクエストを、Shopifyが処理します。ステータスが完了したら、別のエンドポイントから確認して、ファイルをダウンロードすることが可能になります。
どんなときにこの機能を使用できるのでしょうか?
おそらくあなたはデータ処理系のアプリをインストールして、マーチャントに素敵なダッシュボードを見せたいはずです。マーチャントが最初にあなたのアプリをインストールしたとき、彼らのデータを一括でダウンロードできれば、ビジネスインテリジェンス(BI)ツールを使って彼らが求めているインサイトを提供できます。
別の方法として、webhookを使用しているとしましょう。webhookのデリバリーは必ず保証されるので、便利です。Reconcile処理の実装やクローンのスケジューリングを一括ミューテーションでおこなうことができ、そうすると日々、前日の注文をすべて取得するといったことが可能です。
上述の例では、全商品を取得していますが、ほかのパラメータを渡すことも簡単にできます。では、特定の日に作成されたデータだけを取得したいとしましょう。すべてのwebhookを受け取ったかどうかを問わず、包括的なデータのリストが入手できることがわかると思います。
世界の起業家に向けた構築
ブログに掲載される前にこのシリーズの動画をチェックしませんか? ShopifyDevs YouTubeチャンネルを登録して、開発のインスピレーション、便利なテクニック、実践的な方法を獲得しましょう。
登録する一括処理で在庫アイテムを更新する
もう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では構造的に解消できない不備を解決するために設計されました。