

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 再試行動作
<a name="feature-retry-behavior"></a>

**注記**  
設定ページのレイアウトの理解、または以下の ** AWS SDKs**「」を参照してください[このガイドの設定ページについて](settings-reference.md#settingsPages)。

再試行動作には、SDK が AWS のサービスへのリクエストによる障害からの回復を試みるかに関する設定が含まれます。

この機能を設定するには、以下のように使用します。

**`retry_mode` - 共有 AWS `config`ファイル設定`AWS_RETRY_MODE` - 環境変数`aws.retryMode` - JVM システムプロパティ: Java/Kotlin のみ**  
SDK または開発者ツールが再試行を試みる方法を指定します。  
**デフォルト値:** この値は SDK に固有です。特定の SDK ガイドまたは SDK のコードベースでデフォルトの `retry_mode` を確認してください。  
**有効な値:**   
+ `standard` – (推奨) AWS SDKs 全体で推奨される再試行ルールのセット。このモードには、再試行されるエラーの標準セットが含まれており、再試行回数を自動的に調整して可用性と安定性を最大化します。このモードは、マルチテナントアプリケーションで安全に使用できます。`max_attempts` が明示的に設定されていない限り、このモードでのデフォルトの最大試行回数は 3 回です。
+ `adaptive` – 標準モードの機能やクライアント側のレートの自動制限を含む、特殊なユースケースにのみ適した再試行モード。この再試行モードは、アプリケーションテナントを慎重に分離しない限り、マルチテナントアプリケーションにはお勧めしません。詳細については「[`standard` と `adaptive` の再試行モードを選択する](#standardvsadaptive)」を参照してください。このモードは実験段階であり、将来的に動作が変更される可能性があります。
+ `legacy` – (非推奨) ご使用の SDK に固有 (特定の SDK ガイドまたは SDK のコードベースを確認してください)。

**`max_attempts` - 共有 AWS `config`ファイル設定`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` の再試行モードを選択する
<a name="standardvsadaptive"></a>

使用状況が `adaptive` に適していることが確実でない限り、`standard` 再試行モードを使用することをお勧めします。

**注記**  
`adaptive` モードは、バックエンドサービスがリクエストをスロットルする範囲に基づいてクライアントをプールしていることを前提としています。これを行わないと、両方のリソースに同じクライアントを使用している場合、1 つのリソースのスロットリングにより、無関係なリソースのリクエストが遅延する可能性があります。


| 標準 | アダプティブ | 
| --- | --- | 
| アプリケーションのユースケース: すべて。 | アプリケーションのユースケース: [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/sdkref/latest/guide/feature-retry-behavior.html)  | 
| サーキットブレークをサポートして、停止中に SDK が再試行するのを防ぎます。 | サーキットブレークをサポートして、停止中に SDK が再試行するのを防ぎます。 | 
| 障害発生時にジッターされたエクスポネンシャルバックオフを使用します。 | 動的バックオフ期間を使用して、レイテンシーが増加する可能性と引き換えに、失敗したリクエストの数を最小限に抑えるよう試みます。 | 
| 最初のリクエストの試行が遅延することはなく、再試行のみが遅延します。 | 最初のリクエスト試行をスロットルまたは遅延できます。 | 

`adaptive` モードを使用する場合、アプリケーションはスロットルされる可能性のある各リソースを中心に設計されたクライアントを構築する必要があります。この場合、リソースは、それぞれについて考えるよりも細かく調整されます AWS のサービス。 は、リクエストをスロットリングするために使用する追加のディメンションを持つ AWS のサービス ことができます。Amazon DynamoDB サービスを例として使用しましょう。DynamoDB は、 AWS リージョン とアクセスされるテーブルを使用してリクエストを調整します。つまり、コードがアクセスしている 1 つのテーブルは、他のテーブルよりもスロットルされる可能性があります。コードが同じクライアントを使用してすべてのテーブルにアクセスし、それらのテーブルのいずれかへのリクエストがスロットルされた場合、アダプティブ再試行モードでは、すべてのテーブルのリクエストレートが低下します。コードは、リージョンとテーブルのペアごとに 1 つのクライアントを持つように設計する必要があります。`adaptive` モードの使用時に予期しないレイテンシーが発生した場合は、使用しているサービスの特定の AWS ドキュメントガイドを参照してください。

## 再試行モードの実装の詳細
<a name="standardvsadaptiveimplementation"></a>

 AWS SDKs[トークンバケット](https://en.wikipedia.org/wiki/Token_bucket)を使用して、リクエストを再試行するかどうか、およびリクエストの送信速度 (`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`:**

 デフォルトの最大試行回数は、`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 SDKsとツールによるサポート
<a name="feature-retry-behavior-sdk-compat"></a>

以下の SDK は、このトピックで説明する機能と設定をサポートします。部分的な例外があれば、すべて記載されています。JVM システムプロパティ設定は、 AWS SDK for Java と AWS SDK for Kotlin でのみサポートされます。


| SDK | サポート | 注意または詳細情報 | 
| --- | --- | --- | 
| [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/) v2 | はい |  | 
| [SDK for C\+\+](https://docs.aws.amazon.com/sdk-for-cpp/latest/developer-guide/) | はい |  | 
| [SDK for Go V2 (1.x)](https://docs.aws.amazon.com/sdk-for-go/v2/developer-guide/) | はい |  | 
| [SDK for Go 1.x (V1)](https://docs.aws.amazon.com/sdk-for-go/latest/developer-guide/) | いいえ |  | 
| [SDK for Java 2.x](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/) | はい |  | 
| [SDK for Java 1.x](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/) | はい | JVM システムプロパティ: aws.maxAttempts の代わりに com.amazonaws.sdk.maxAttempts を使用し、aws.retryMode の代わりに com.amazonaws.sdk.retryMode を使用します。 | 
| [SDK for JavaScript 3.x](https://docs.aws.amazon.com/sdk-for-javascript/latest/developer-guide/) | はい |  | 
| [SDK for JavaScript 2.x](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/) | いいえ | 最大再試行回数、ジッターを伴うエクスポネンシャルバックオフ、再試行バックオフのカスタムメソッドのオプションをサポートします。 | 
| [SDK for Kotlin](https://docs.aws.amazon.com/sdk-for-kotlin/latest/developer-guide/) | はい |  | 
| [SDK for .NET 4.x](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/) | はい |  | 
| [SDK for .NET 3.x](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/) | はい |  | 
| [SDK for PHP 3.x](https://docs.aws.amazon.com/sdk-for-php/latest/developer-guide/) | はい |  | 
| [SDK for Python (Boto3)](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html) | はい |  | 
| [SDK for Ruby 3.x](https://docs.aws.amazon.com/sdk-for-ruby/latest/developer-guide/) | はい |  | 
| [SDK for Rust](https://docs.aws.amazon.com/sdk-for-rust/latest/dg/) | はい |  | 
| [SDK for Swift](https://docs.aws.amazon.com/sdk-for-swift/latest/developer-guide/) | はい |  | 
| [PowerShell V5 のツール](https://docs.aws.amazon.com/powershell/latest/userguide/) | はい |  | 
| [PowerShell V4 のツール](https://docs.aws.amazon.com/powershell/v4/userguide/) | はい |  | 