翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
再試行動作
注記
設定ページのレイアウトを理解したり、以下の AWS SDK とツールによるサポートの表を解釈したりするには、「このガイドの設定ページについて」を参照してください。
再試行動作には、SDK が AWS のサービス へのリクエストによる障害からの回復を試みるかに関する設定が含まれます。
この機能を設定するには、以下のように使用します。
retry_mode- AWSconfig共有ファイル設定AWS_RETRY_MODE- 環境変数aws.retryMode- JVM システムプロパティ: Java/Kotlin のみ-
SDK または開発者ツールが再試行を試みる方法を指定します。
デフォルト値: この値は SDK に固有です。特定の SDK ガイドまたは SDK のコードベースでデフォルトの
retry_modeを確認してください。有効な値:
-
standard– (推奨) AWS SDK 全体で推奨される再試行ルールのセット。このモードには、再試行されるエラーの標準セットが含まれており、再試行回数を自動的に調整して可用性と安定性を最大化します。このモードは、マルチテナントアプリケーションで安全に使用できます。max_attemptsが明示的に設定されていない限り、このモードでのデフォルトの最大試行回数は 3 回です。 -
adaptive– 標準モードの機能やクライアント側のレートの自動制限を含む、特殊なユースケースにのみ適した再試行モード。この再試行モードは、アプリケーションテナントを慎重に分離しない限り、マルチテナントアプリケーションにはお勧めしません。詳細については「standard と adaptive の再試行モードを選択する」を参照してください。このモードは実験段階であり、将来的に動作が変更される可能性があります。 -
legacy– (非推奨) ご使用の SDK に固有 (特定の SDK ガイドまたは SDK のコードベースを確認してください)。
-
max_attempts- AWSconfig共有ファイル設定AWS_MAX_ATTEMPTS- 環境変数aws.maxAttempts- JVM システムプロパティ: Java/Kotlin のみ-
1 回のリクエストで行う最大試行回数を指定します。
デフォルト値:この値が指定されていない場合、デフォルトは
retry_modeの設定の値によって異なります。-
retry_modeがlegacyの場合 – SDK 固有のデフォルト値を使用します(max_attemptsデフォルトについては、特定の SDK ガイドまたは SDK のコードベースを確認してください)。 -
retry_modeがstandardの場合 – 3 回試行します。 -
retry_modeがadaptiveの場合 – 3 回試行します。
有効な値: 0 より大きい数値。
-
standard と adaptive の再試行モードを選択する
使用状況が adaptive に適していることが確実でない限り、standard 再試行モードを使用することをお勧めします。
注記
adaptive モードは、バックエンドサービスがリクエストをスロットルする範囲に基づいてクライアントをプールしていることを前提としています。これを行わないと、両方のリソースに同じクライアントを使用している場合、1 つのリソースのスロットリングにより、無関係なリソースのリクエストが遅延する可能性があります。
| 規格 | アダプティブ |
|---|---|
| アプリケーションのユースケース: すべて。 | アプリケーションのユースケース:
|
| サーキットブレークをサポートして、停止中に SDK が再試行するのを防ぎます。 | サーキットブレークをサポートして、停止中に SDK が再試行するのを防ぎます。 |
| 障害発生時にジッターされたエクスポネンシャルバックオフを使用します。 | 動的バックオフ期間を使用して、レイテンシーが増加する可能性と引き換えに、失敗したリクエストの数を最小限に抑えるよう試みます。 |
| 最初のリクエストの試行が遅延することはなく、再試行のみが遅延します。 | 最初のリクエスト試行をスロットルまたは遅延できます。 |
adaptive モードを使用する場合、アプリケーションはスロットルされる可能性のある各リソースを中心に設計されたクライアントを構築する必要があります。この場合、リソースは、各 AWS のサービスだけについて考えるよりも細かく調整されます。AWS のサービス は、リクエストをスロットルするために使用する追加のディメンションを持つことができます。Amazon DynamoDB サービスを例として使用しましょう。DynamoDB は、AWS リージョンとアクセスされるテーブルを使用してリクエストをスロットルします。つまり、コードがアクセスしている 1 つのテーブルは、他のテーブルよりもスロットルされる可能性があります。コードが同じクライアントを使用してすべてのテーブルにアクセスし、それらのテーブルのいずれかへのリクエストがスロットルされた場合、アダプティブ再試行モードでは、すべてのテーブルのリクエストレートが低下します。コードは、リージョンとテーブルのペアごとに 1 つのクライアントを持つように設計する必要があります。adaptive モードの使用時に予期しないレイテンシーが発生した場合は、使用しているサービス固有の AWS ドキュメントガイドを参照してください。
再試行モードの実装の詳細
AWS SDK はトークンバケットadaptive 再試行モードの場合) を決定します。SDK では、再試行トークンバケットとリクエストレートトークンバケットの 2 つのトークンバケットが使用されます。
-
再試行トークンバケットは、SDK が停止中にアップストリームサービスとダウンストリームサービスを保護するために再試行を一時的に無効にする必要があるかどうかを判断するために使用されます。再試行する前にバケットからトークンが取得され、リクエストが成功するとバケットにトークンが返されます。再試行時にバケットが空の場合、SDK はリクエストを再試行しません。
-
リクエストレートトークンバケットは
adaptive再試行モードでのみ使用され、リクエストの送信レートを決定します。リクエストが送信される前にバケットからトークンが取得され、サービスによって返されるスロットリングレスポンスに基づいて動的に決定されたレートでバケットにトークンが返されます。
以下は、standard と adaptive 再試行モードの両方の大まかな擬似コードです。
MakeSDKRequest() { attempts = 0 loop { GetSendToken() response = SendHTTPRequest() RequestBookkeeping(response) if not Retryable(response) return response attempts += 1 if attempts >= MAX_ATTEMPTS: return response if not HasRetryQuota(response) return response delay = ExponentialBackoff(attempts) sleep(delay) } }
擬似コードで使用されるコンポーネントの詳細は次のとおりです。
GetSendToken:
このステップは adaptive 再試行モードでのみ使用されます。このステップでは、リクエストレートトークンバケットからトークンを取得します。トークンが使用できない場合、トークンが利用可能になるまで待機します。SDK には、待機する代わりにリクエストを失敗させる設定オプションが用意されている場合があります。バケット内のトークンは、クライアントが受信したスロットリングレスポンスの数に基づいて動的に決定されるレートで補充されます。
SendHTTPRequest:
このステップでは、リクエストを AWS に送信します。ほとんどの AWS SDK は接続プールを使用する HTTP ライブラリを使用し、HTTP リクエストを行う際に既存の接続を再利用します。一般的に、スロットリングエラーが原因でリクエストが失敗した場合、接続は再利用されますが、一時的なエラーが原因でリクエストが失敗した場合は再利用されません。
RequestBookkeeping:
リクエストが成功すると、トークンがトークンバケットに追加されます。adaptive 再試行モードの場合のみ、リクエストレートトークンバケットのフィルレートは、受信したレスポンスのタイプに基づいて更新されます。
Retryable:
このステップでは、以下に基づいて応答を再試行できるかどうかを判断します。
-
HTTP ステータスコード
-
サービスから返されたエラーコード。
-
接続エラーとは、SDK が受信したエラーの中で、サービスからの HTTP 応答が受信されないすべてのエラーを指します。
一時的なエラー(HTTP ステータスコード 400、408、500、502、503、504)とスロットリングエラー(HTTP ステータスコード 400、403、429、502、503、509)はすべて再試行される可能性があります。SDK の再試行動作は、エラーコードまたはサービスからのその他のデータと組み合わせて決定されます。
MAX_ATTEMPTS:
デフォルトの最大試行回数は、max_attempts 設定によって上書きされない限り、retry_mode 設定によって設定されます。
HasRetryQuota
このステップでは、再試行トークンバケットからトークンを取得します。再試行トークンバケットが空の場合、リクエストは再試行されません。
ExponentialBackoff
再試行可能なエラーの場合、再試行遅延は台形型エクスポネンシャルバックオフを使用して計算されます。SDK はジッター付きの切り捨て二進エクスポネンシャルバックオフを使用します。次のアルゴリズムは、i リクエストに対する応答の休止時間(秒単位)がどのように定義されているかを示しています。
seconds_to_sleep_i = min(b*r^i, MAX_BACKOFF)
前述のアルゴリズムでは、以下の値が適用されます。
b = random number within the range of: 0 <= b <= 1
r = 2
ほとんどの SDK では MAX_BACKOFF = 20 seconds です。確認のため、特定の SDK ガイドまたはソースコードを参照してください。
AWS SDK とツールによるサポート
以下の SDK は、このトピックで説明する機能と設定をサポートします。部分的な例外があれば、すべて記載されています。JVM システムプロパティ設定は、AWS SDK for Java と AWS SDK for Kotlin でのみサポートされます。
| SDK | サポート | 注意または詳細情報 |
|---|---|---|
| AWS CLI v2 | あり | |
| SDK for C++ | あり | |
| SDK for Go V2 (1.x) |
あり | |
| SDK for Go 1.x (V1) | なし | |
| SDK for Java 2.x | あり | |
| SDK for Java 1.x | あり | JVM システムプロパティ: aws.maxAttempts の代わりに com.amazonaws.sdk.maxAttempts を使用し、aws.retryMode の代わりに com.amazonaws.sdk.retryMode を使用します。 |
| SDK for JavaScript 3.x | あり | |
| SDK for JavaScript 2.x | なし | 最大再試行回数、ジッターを伴うエクスポネンシャルバックオフ、再試行バックオフのカスタムメソッドのオプションをサポートします。 |
| SDK for Kotlin | あり | |
| SDK for .NET 4.x | あり | |
| SDK for .NET 3.x | あり | |
| SDK for PHP 3.x | あり | |
| SDK for Python (Boto3) |
あり | |
| SDK for Ruby 3.x | あり | |
| SDK for Rust | あり | |
| SDK for Swift | あり | |
| Tools for PowerShell V5 | あり | |
| Tools for PowerShell V4 | あり |