Shopifyのレート制限?リーキーバケットアルゴリズムやGraphQLについてもイラストで解説
こんにちは!今回はShopifyのレート制限やGraphQLについて説明する記事となっています。「レート制限ってなに?」「GraphQLなにそれ?」という疑問が少しだけ解決するように難しい表現は使用せずご説明します。ただ、少し聞き慣れない単語が出てくるかもしれません。特に API について少しだけでも理解できていることが前提となりますので「APIという単語は全く聞いたことがない」という場合はYouTube動画などを見て少しだけ勉強してみてくださいね。
REST API と GraphQL
Shopifyでは顧客情報や注文情報等のデータを取得、作成、アップデート、削除する際のAPI(Admin API)としてREST APIとGraphQLの二種類が用意されています。
ShopifyにおけるREST APIとGraphQLの違いを、とってもざっくりご説明します。専門的な内容ではなく、なんとなく形を掴むためだけのご説明となっていますので詳しくはぜひご自身で調べてみてくださいね。
今回はShopifyの顧客情報を例にとってご説明します。
REST API
例えばとある顧客の名前と住所を知りたい場合、ShopifyのREST APIを用いるとこのようになります。
APIを呼ぶ側「顧客番号xxxx番の情報をください」
Shopify「顧客番号xxxx番の情報です」(名前・住所・購入回数・購入金額などなど全部乗せ)
上記のように、特定の情報が欲しいだけでもShopifyは「全部乗せ」でデータを返してきます。返されたデータをもとに、必要な情報だけを取り出す処理がAPIを呼ぶ側では必要になってきます。
https://shopify.dev/docs/api/admin-rest/2024-07/resources/customer
GraphQL
REST APIと同様に、とある顧客の名前と住所を知りたい場合、GraphQLではこのようになります。
APIを呼ぶ側「顧客番号xxxx番のemail・名前・住所の情報をください」
Shopify「顧客番号xxxx番のemail・名前・住所はこちらです」
このように、必要な情報だけを取得することが可能です。もちろん名前・住所だけでなく直近5回の購入商品などの情報を合わせて取得することができます。
https://shopify.dev/docs/api/admin-graphql/2024-07/queries/customer
とっても、かなり、大幅に端折ってShopifyでのREST APIとGraphQLの違いについてご説明しました。この違いはこの先お話するレート制限についても関わってくるのでぼんやりだけでも良いので覚えておいてくださいね。
Shopifyのレート制限
Shopifyにはレート制限が設けられており、その制限はREST APIとGraphQLで形態が少し異なっています。
レート制限とは…?
そもそもレート制限とは何かと簡単にお伝えすると、APIプロバイダー(今回の場合はShopify)が、特定の時間枠内にユーザーが行える API リクエスト数を制限する仕組みのことです。
以下の図のように「あの情報をくれ」「この情報をくれ」「あの情報を消してくれ」「この情報にこれを加えてくれ」といったリクエストを無制限に受け付けていたらAPIのサーバーに高負荷がかかりシステムが正常に動かなくなる可能性があります。
意図しないサーバーのクラッシュ等を避けるために、Shopifyのみならずデータを提供するサービスでは様々なレート制限が設けられています。
Shopifyレート制限の種類
REST APIのレート制限
REST APIはリクエストベースの制限で、スタンダードリミットでは1秒当たり2リクエストまでとなっています。
この「1リクエスト」が何を指すのかというと、
GET 情報を取る
POST 情報を追加する
DELETE 情報を削除する
PUT 情報を編集する
このそれぞれ1つずつが1リクエストとなり、10件の情報をGETする場合は10リクエスト、1件の情報を削除する場合は1リクエストという事になります。
とてもシンプルですよね。
GraphQLのレート制限
REST APIの制限は大変シンプルでした。ではGraphQLの制限はどうでしょうか?
上の図にはメソッドの欄に「Calculated Query Score」、リミットは「100points/second」と記載があります。これはどういうことでしょうか…?
GraphQLでは、「1つの情報を取る=1リクエスト」という計算にはなりません。
APIをコールする際、 オブジェクトの取得は「1ポイント」 、 データの更新、作成、削除を要求するミューテーションは「各10ポイント」 となっています。
https://shopify.dev/docs/api/usage/rate-limits#calculated-query-costs
20件の情報を 取得するだけ であれば、合計20ポイント。「100points/second」という制限内で問題なく処理が可能です。
では、 20件の情報を更新 する場合は?ミューテーションは1件10ポイントのため20件では200ポイントという計算になります。
REST APIがあまりにもシンプル過ぎるため少し複雑に感じるかもしれませんが、GraphQLのポイント計算も思ったより簡単かなと思います。
上記の数字を見ただけでも、REST APIよりもGraphQLの方が効率的であると感じますよね。Shopify公式でもGraphQLの使用を推奨しています。
触ったことがない方は少し学習に時間がかかるかもしれませんがぜひ挑戦してみましょう。
穴あきバケツ
「穴あきバケツ」は立派なIT用語。英名の「リーキーバケットアルゴリズム」という単語なら聞いたことがあるかも…という方もいるかも?
リーキーバケットアルゴリズムとは、レート制限を処理する際のアルゴリズムの一つです。
名前そのまま穴があいたバケツのようにリクエストを処理します。
REST APIのバケツ
一度に処理できるサイズ、バケツのサイズは40リクエスト(ショップ単位・アプリ単位)で1秒に2リクエストずつリークしていくようになっています。
視覚的にざっくり説明するとこのような感じに。リクエストの種類に限らず「1リクエスト」となるため、数が多くなるとどうしてもToo Many Requestsのエラーが返って来やすい状況です。
GraphQLのバケツ
GraphQLのバケツサイズは1000 cost points(ショップ単位・アプリ単位)で1秒に50 pointsリークしていきます。
表現は少し複雑に感じますが、REST APIと考え方は基本的に同じです。
REST APIと同じ数のリクエストを送信しましたが、GraphQLの場合はまだ十分にバケツの中身が残っているためさらに多くのデータを処理することが可能です。
上記の例ではMutationのリクエストを送信したと仮定して説明していますが、これがデータ取得だけのQueryであればリクエストのコストポイントは10分の1の「1 point」のため、さらに余裕のある状況になります。
REST APIに比べ、コストはぐっと低いですがそれでもLine Itemと言われる商品を一つ一つ大量に処理しようとするとどうしてもレート制限がかかりやすくなってしまいます。
解決方法として、ShopifyのGraphQLにはBulk Operationという非同期での一括処理の方法も用意されています。
https://shopify.dev/docs/api/usage/bulk-operations/queries
カスタムアプリを作ってみたけれどもすぐに制限がかかってしまう、処理を高速化したいなどのお悩みなどありましたらぜひ一度GO RIDEへお問い合わせください。
GraphQLを学んでShopifyのデータを効率的に利用する
REST APIは比較的簡単でWEBアプリケーションを学んだことのある人は一度は触れたのではないかと思います。必要とするデータ量やAPIの数が少ないのであればREST APIでも十分にアプリケーションを動かすことが可能です。
反対にGraphQLは少し特殊な方法ですがShopifyのようにデータの種類や量が多い、大きいという場合には効率的にデータを扱うことができます。
加えて、GraphQLはShopify公式も推奨している方法。最初は少しハードルが高く、学習コストもかかってしまいますが興味のある方はぜひ勉強してみてくださいね。
Shopify公式のShopifyDevs YouTubeチャンネルでは様々な解説動画が公開されています。私もとってもお世話になっていますし、今回の記事を書く際の参考にもさせていただいています。
全編英語なので少しハードルが高いですが、日本語字幕が付けられたりするので気になる方はぜひ参考に見てみてください。
https://www.youtube.com/@shopifydevs
Shopifyをもっともっと活用する
今回の記事は少しだけ専門的な内容でした。正直にお伝えすると、Shopifyでストアを開いて運用するだけであればあまり必要のない知識かもしれません。
しかし、Shopifyの可能性は無限大!自分の好きなようにストアをどんどん拡張することが可能です。
Shopify App Storeですでに用意されているアプリケーションを導入することはもちろんですが、自分ならでは、自社ならではの需要にあったものはAPIを使ってカスタムアプリケーションを作ってみるのもいいかも…?
Shopifyのストア構築でお悩みの方はぜひGO RIDEへお問い合わせください。皆さまのストアに合ったアプリケーションのご提案や構築などをお手伝いさせていただきます!