翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
再試行動作
注記
設定ページのレイアウトの理解、または以下の AWS SDKs「」を参照してくださいこのガイドの設定ページについて。
再試行動作には、SDK が AWS のサービスへのリクエストによる障害からの回復を試みるかに関する設定が含まれます。
この機能を設定するには、以下のように使用します。
retry_mode
- 共有 AWSconfig
ファイル設定AWS_RETRY_MODE
- 環境変数aws.retryMode
- JVM システムプロパティ: Java/Kotlin のみ-
SDK または開発者ツールが再試行を試みる方法を指定します。
デフォルト値: この値は SDK に固有です。特定の SDK ガイドまたは SDK のコードベースでデフォルトの を確認します
retry_mode
。有効な値:
-
standard
– (推奨) AWS SDKs 全体で推奨される再試行ルールのセット。このモードには、再試行されるエラーの標準セットが含まれており、再試行回数を自動的に調整して可用性と安定性を最大化します。このモードは、マルチテナントアプリケーションで安全に使用できます。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
再試行モードの選択
の使用が により適していることが確実でない限り、standard
再試行モードを使用することをお勧めしますadaptive
。
注記
adaptive
モードは、バックエンドサービスがリクエストをスロットリングするスコープに基づいてクライアントをプールしていることを前提としています。これを行わないと、両方のリソースに同じクライアントを使用している場合、1 つのリソースのスロットリングにより、無関係なリソースのリクエストが遅延する可能性があります。
標準 | アダプティブ |
---|---|
アプリケーションのユースケース: すべて。 | アプリケーションのユースケース:
|
サーキットブレークをサポートして、停止中に SDK が再試行するのを防ぎます。 | サーキットブレークをサポートして、停止中に SDK が再試行するのを防ぎます。 |
障害発生時にジッターされたエクスポネンシャルバックオフを使用します。 | 動的バックオフ期間を使用して、レイテンシーが増加する可能性と引き換えに、失敗したリクエストの数を最小限に抑えるよう試みます。 |
最初のリクエストの試行を遅らせることはなく、再試行のみを行います。 | 最初のリクエスト試行をスロットリングまたは遅延できます。 |
adaptive
モードを使用する場合、アプリケーションはスロットリングされる可能性のある各リソースを中心に設計されたクライアントを構築する必要があります。この場合、リソースは、それぞれについて考えるよりも細かく調整されます AWS のサービス。 は、リクエストのスロットリングに使用する追加のディメンションを持つ AWS のサービス ことができます。例として Amazon DynamoDB サービスを使用しましょう。DynamoDB は、アクセスされるテーブル AWS リージョン に加えて を使用してリクエストを調整します。つまり、コードがアクセスしている 1 つのテーブルは、他のテーブルよりもスロットリングされる可能性があります。コードが同じクライアントを使用してすべてのテーブルにアクセスし、それらのテーブルの 1 つへのリクエストがスロットリングされた場合、アダプティブ再試行モードではすべてのテーブルのリクエストレートが低下します。コードは、Region-and-tableつのクライアントを持つように設計する必要があります。adaptive
モードの使用時に予期しないレイテンシーが発生した場合は、使用しているサービスの特定の AWS ドキュメントガイドを参照してください。
再試行モードの実装の詳細
AWS SDKsトークンバケット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 SDKsは、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
:
デフォルトの最大試行回数は、 retry_mode
設定によって上書きされない限り、 max_attempts
設定によって設定されます。
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 SDKsとツールによるサポート
以下の 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 システムプロパティ: com.amazonaws.sdk.maxAttempts の代わりに を使用しますaws.maxAttempts 。 com.amazonaws.sdk.retryMode の代わりに を使用しますaws.retryMode 。 |
SDK for JavaScript 3.x | はい | |
SDK for JavaScript 2.x | いいえ | 最大再試行回数、ジッターを伴うエクスポネンシャルバックオフ、再試行バックオフのカスタムメソッドのオプションをサポートします。 |
SDK for Kotlin | はい | |
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 | はい |