Shopify GraphQLのキャッシュ化:実践ガイド
GraphQLはRESTとは仕組みが異なります。URL単位でのキャッシュはできません。RESTでは、1つのエンドポイントが1つのキャッシュエントリに対応します。一方、GraphQLでは1つのエンドポイントですべてを処理します。同じURLへの2つのリクエストであっても、返されるデータは異なる場合があります。
GraphQLを正しくキャッシュするには、キャッシュキーに以下を含める必要があります:
- クエリ
- 変数
- ユーザーコンテキスト(ロケールまたはバイヤーセグメント)
高速なシステムを構築するために、レイヤーを活用しましょう:
- クライアントキャッシュ:ブラウザでのセッション再利用用。
- エッジキャッシュ:公開されているストアフロントページ用。
- アプリキャッシュ:サーバー上の共有データ用。
- Persisted queries:安定したハッシュベースのキー用。
キャッシュの保持時間は、データの更新頻度に合わせて設定してください。
以下の項目は、長期間キャッシュしてください:
- 商品詳細
- コレクション
- ショップ設定
以下の項目は、短期間キャッシュしてください:
- 価格
- 在庫状況
以下の項目は、絶対にキャッシュしないでください:
- カート
- チェックアウトプロセス
- 顧客固有の価格
B2Bストアを対象とする場合は、キャッシュキーに会社IDを含める必要があります。これを行わないと、顧客Aが顧客Bの契約価格を見てしまう可能性があります。
データの鮮度を管理するために、以下の3つの手法を使用します:
- TTL (Time-based): 有効期限を設定します。シンプルですが、多くの場合、推測に基づいた設定になります。
- Webhooks (Event-based): これが最も正確です。商品が更新されると、ShopifyがWebhookを送信します。そのWebhookを使用して、古いキャッシュエントリを削除します。
- Stale-while-revalidate: バックグラウンドでキャッシュを更新している間に、古いデータを即座に提供します。
信頼性の高いWebhookハンドラーを構築してください。Webhookが失敗すると、キャッシュが古いままになってしまいます。これを防ぐためにリトライ処理を導入しましょう。
戦略が機能しているかを確認するために、以下のメトリクスに注目してください:
- ヒット率: 高いヒット率を目指します。
- レイテンシ: レスポンスタイムが低下することを確認します。
- 回避されたAPIコール数: ヒット率が高ければ、コストを抑えられます。
- データの不整合 (Stale incidents): 誤った価格や在庫情報の表示をゼロにすることが目標です。
キャッシュを階層化しましょう。有効期限はデータの変動性に合わせて設定します。古いデータをクリアするにはWebhookを使用します。パーソナライゼーションを考慮したキーを構築してください。
出典: https://dev.to/masadashraf/caching-shopify-graphql-a-practical-guide-for-developers-33k8