Experience Edgeへのリクエストにはリトライ戦略を使う
このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。
Experience Edge GraphQLエンドポイントはレート制限されており、特定の時間枠(現在は毎秒80リクエスト)にリクエスト数に制限があります。静的生成(SSG)を有効にして大規模なNext.jsアプリケーションを構築したりデプロイしたりすると、その制限に達してビルドプロセスが失敗することがあります。
ビルド時に、Next.jsアプリケーションは複数のサービスを通じてエンドポイントにリクエストを送信します。リトライ戦略を実装し、リトライ回数(グローバルまたは各サービスごと)を指定することで、大規模ウェブサイトの本番コードを正常に生成できます。
!注リトライ戦略は、JSSバージョン20の20.3以降、バージョン21の21.6.3以降で利用可能です。
再試行回数を設定する
グローバルまたはサービスごとに特定のリトライ回数を設定することができます。
リトライ回数をグローバルに設定します
Next.js JSSアプリケーションはGRAPH_QL_SERVICE_RETRIES環境変数を使って、GraphQLエンドポイント(レイアウト、辞書、エラーページサービス)を使用するすべてのサービスに対してGraphQLリクエストの再試行回数を設定します。再試行は、環境変数のデフォルト値に基づいて最初に3に設定されます。すべてのサービスの再試行を無効にするには、その値を0に設定できます。
リトライ回数をグローバルに設定するには:
- GRAPH_QL_SERVICE_RETRIES環境変数の値を希望する値(正の整数、または無効化は0)に更新します。
サービスごとのリトライ回数を設定します
各サービスごとに異なるリトライ回数を指定したい場合は、各サービスのretriesオプションの値を正の整数または0に設定するか、各サービスごとにカスタム環境変数を定義することができます。いずれの場合も、必要に応じて以下のファイルを変更してください:
- レイアウトサービスについては: src/lib/layout-service-factory.ts。
- 辞書サービスについては: src/lib/dictionary-service-factory.ts。
- エラーページサービスについては、 src/pages/404.tsx と src/pages/500.tsx。
!注環境変数を追加したり、GRAPH_QL_SERVICE_RETRIESの値を変更した場合は、デプロイプラットフォームやパイプラインのテストなどに必要な変更を忘れないでください。
デフォルトの再試行戦略を修正してください
再試行回数を正の整数に設定している場合、影響を受けるサービスはその数値に基づくデフォルトの再試行戦略を使い、その指数関数的なバックオフ/遅延係数は2です。
デフォルトの再試行戦略は以下の応答ステータスコードを処理します:
- 429 - リクエストが多すぎる。
- 502 - 504 - サーバーエラー。
- 520 - 524 - エッジ固有のエラー。
また、以下の エラーコードもサポートしています:
- ECONNRESET - 接続リセットエラー
- ETIMEDOUT - タイムアウトエラー
- EPROTO - プロトコルエラー
必要に応じて、デフォルトの戦略のステータスコード、エラーコード、バックオフ/遅延係数のリストを変更できます。
デフォルトの再試行戦略を変更するには:
-
例えば、サービスファクトリーファイル /src/lib/dictionary-service-factory.tsでは、DefaultRetryStrategyクラスをインポートします:
import { DefaultRetryStrategy } from '@sitecore-jss/sitecore-jss-nextjs';
-
GraphQLのサービスオプションで、希望するエラーコード、ステータスコード、遅延係数を指定することで、デフォルトの再試行戦略設定を変更します。デフォルト設定が存在しない場合は、まずそれを追加する必要があります。例えば:
retries: (process.env.GRAPH_QL_SERVICE_RETRIES && parseInt(process.env.GRAPH_QL_SERVICE_RETRIES, 10)) || 0, retryStrategy: new DefaultRetryStrategy({ statusCodes: 402, 409; errorCodes: 'ENOTFOUND', 'ETIMEDOUT'; factor: 1})
カスタム戦略を作成する
ステータスコード、エラーコード、遅延因子以外にリトライ戦略をカスタマイズしたい場合は、RetryStrategyインターフェースに基づいて独自のリトライ戦略クラスを実装できます。
インターフェースはエラーと試みに基づいて再試行を行うGraphQL要求の戦略を定義しています。以下の2つのメソッドを定義しています。
-
shouldRetry - errorとattemptカウントに基づいてリクエストを再試行すべきかどうかを判断します。ブール値を返し、以下のパラメータを必要とします。
パラメータ
概要
error
GraphQLリクエストから受け取った GraphQLClientError 型のエラー。 GraphQLClientError 型は ClientError 型と NodeJS.ErrornoException 型の両方を処理します。
retries
設定されたリトライ回数。
デフォルト
attempt
現在の試み回数。
-
getDelay - 与えられたerrorと計attemptカウントに基づき、次のリトライ前の遅延(ミリ秒単位)を計算します。次のリトライの遅延をミリ秒単位で返し、以下のパラメータが必要です:
パラメータ
概要
error
GraphQLリクエストから受け取った GraphQLClientError 型のエラー。 GraphQLClientError 型は ClientError 型と NodeJS.ErrornoException 型の両方を処理します。
attempt
現在の試み回数。
カスタムリトライ戦略を作成するには:
-
例えば、サービスファクトリーファイル /src/lib/dictionary-service-factory.ts、でRetryStrategyインターフェースをインポートします:
import { RetryStrategy, ClientError, GraphQLClientError, } from '@sitecore-jss/sitecore-jss-nextjs';
-
RetryStrategy型の新しい定数を宣言し、shouldRetryメソッドとgetDelayメソッドを実装します。例えば:
const customRetryStrategy: RetryStrategy = { shouldRetry: (error: GraphQLClientError, retries: number, attempt: number): boolean => true, // Replace this with your own implementation getDelay: (error: GraphQLClientError, attempt: number): number => 1000 // Replace this with your own implementation };
-
カスタムリトライ戦略をGraphQLのサービスオプションに追加してください。例えば:
new GraphQLDictionaryService({ siteName, clientFactory, retries: (process.env.GRAPH_QL_SERVICE_RETRIES && parseInt(process.env.GRAPH_QL_SERVICE_RETRIES, 10)) || 0, retryStrategy: customRetryStrategy })