

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 重试行为
<a name="feature-retry-behavior"></a>

**注意**  
如需了解设置页面布局或解释后面的 Support b **y AWS SDKs 和 tools** 表格的帮助，请参阅[了解本指南的设置页面](settings-reference.md#settingsPages)。

重试行为包括有关如何尝试从向的 SDKs 请求导致的失败中恢复的设置。 AWS 服务

使用以下方法配置此功能：

**`retry_mode`-共享 AWS `config`文件设置`AWS_RETRY_MODE` - 环境变量`aws.retryMode`-JVM 系统属性：仅限 Java/Kotlin **  
指定 SDK 或开发人员工具如何尝试重试。  
**默认值：**此值因具体 SDK 而异。请查看具体的 SDK 指南或 SDK 代码库，以了解其默认 `retry_mode`。  
**有效值：**  
+ `standard`—（推荐）推荐的一组重试规则。 AWS SDKs此模式包括要重试的标准错误集，并且会自动调整重试次数以尽可能提高可用性和稳定性。此模式可在多租户应用程序中安全使用。除非`max_attempts`明确配置，否则此模式下默认的最大尝试次数为三次。
+ `adaptive`：此重试模式仅适用于特殊使用案例，包含标准模式的功能以及自动客户端速率限制。除非您注意隔离应用程序租户，否则不建议将此重试模式用于多租户应用程序。请参阅[可选择 `standard` 和 `adaptive` 重试模式](#standardvsadaptive)了解更多信息。此模式处于实验阶段，未来可能会改变行为。
+ `legacy`：（不推荐）因 SDK 而异（请查看具体 SDK 指南或 SDK 代码库）。

**`max_attempts`-共享 AWS `config`文件设置`AWS_MAX_ATTEMPTS` - 环境变量`aws.maxAttempts`-JVM 系统属性：仅限 Java/Kotlin **  
指定对请求进行的最大尝试次数。  
**默认值：**如果未指定此值，则其默认值取决于`retry_mode`设置的值：  
+ 如果`retry_mode`是`legacy` – 使用特定于 SDK 的默认值（请查看您的特定 SDK 指南或 SDK 的代码库以了解`max_attempts`默认值）。
+ 如果`retry_mode`是`standard` – 尝试三次。
+ 如果`retry_mode`是`adaptive` – 尝试三次。
**有效值：**大于 0 的数字。

## 可选择 `standard` 和 `adaptive` 重试模式
<a name="standardvsadaptive"></a>

除非您确定自己的使用情况更适合 `adaptive`，否则我们建议您使用 `standard` 重试模式。

**注意**  
`adaptive` 模式假设您会根据后端服务可能限制请求的范围来池化客户端。如果不是这种情况，则在将同一客户端同时用于两个资源时，对其中一个资源进行节流可能会导致对不相关资源的请求出现延迟。


| 标准 | 自适应 | 
| --- | --- | 
| 应用程序使用案例：全部。 | 应用程序使用案例：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/sdkref/latest/guide/feature-retry-behavior.html)  | 
| 支持通过熔断来防止 SDK 在中断期间重试。 | 支持通过熔断来防止 SDK 在中断期间重试。 | 
| 在出现故障时使用抖动指数回退。 | 使用动态退避时长来尝试减少失败请求数的量，以换取延迟增加的可能性。 | 
| 永不推迟首次请求尝试，仅推迟重试。 | 可能会节流或推迟首次请求尝试。 | 

如果选择使用 `adaptive` 模式，则应用程序构建的客户端必须围绕每种可能被节流的资源设计。在这种情况下，资源要经过精细调整，而不仅仅是考虑每种资源。 AWS 服务 AWS 服务 可以有其他维度来限制请求。下面以 Amazon DynamoDB 服务为例说明。DynamoDB AWS 区域 使用加上正在访问的表来限制请求。这意味着代码正在访问的一个表受到的节流可能比其他表更大。如果代码使用同一客户端来访问所有表，并且对其中一个表的请求受到节流，则自适应重试模式将降低所有表的请求速率。您的代码应设计为每 Region-and-table对只有一个客户端。如果您在使用`adaptive`模式时遇到意外延迟，请参阅所用服务的特定 AWS 文档指南。

## 重试模式实现详情
<a name="standardvsadaptiveimplementation"></a>

使用 AWS SDKs [令牌桶](https://en.wikipedia.org/wiki/Token_bucket)来决定是否应重试请求以及（在`adaptive`重试模式下）应以多快的速度发送请求。SDK 会使用两个令牌存储桶：一个为重试令牌存储桶，另一个为请求速率令牌存储桶。
+ 重试令牌存储桶用于确定 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`**

 对于可以重试的错误，使用截断的指数回退来计算重试延迟。 SDKs 使用带抖动的截断二进制指数回退。以下算法显示了如何为请求`i`的响应定义睡眠时间（以秒为单位）：

```
seconds_to_sleep_i = min(b*r^i, MAX_BACKOFF)
```

在上述算法中，以下值适用：

`b = random number within the range of: 0 <= b <= 1`

`r = 2`

`MAX_BACKOFF = 20 seconds`对于大多数人来说 SDKs。请参阅您的特定 SDK 指南或源代码进行确认。

## Support AWS SDKs by 和工具
<a name="feature-retry-behavior-sdk-compat"></a>

以下内容 SDKs 支持本主题中描述的功能和设置。所有部分例外情况均已注明。 适用于 Java 的 AWS SDK 和 适用于 Kotlin 的 AWS SDK 唯一支持任何 JVM 系统属性设置。


| SDK | 支持 | 备注或更多信息 | 
| --- | --- | --- | 
| [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/) v2 | 是 |  | 
| [适用于 C\+\+ 的 SDK](https://docs.aws.amazon.com/sdk-for-cpp/latest/developer-guide/) | 是 |  | 
| [适用于 Go V2 (1.x) 的 SDK](https://docs.aws.amazon.com/sdk-for-go/v2/developer-guide/) | 是 |  | 
| [适用于 Go 1.x（V1）的 SDK](https://docs.aws.amazon.com/sdk-for-go/latest/developer-guide/) | 否 |  | 
| [适用于 Java 2.x 的 SDK](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/) | 是 |  | 
| [适用于 Java 1.x 的 SDK](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/) | 是 | JVM 系统属性：使用 com.amazonaws.sdk.maxAttempts 而不是 aws.maxAttempts；使用 com.amazonaws.sdk.retryMode 而不是 aws.retryMode。 | 
| [适用于 JavaScript 3.x 的软件开发工具包](https://docs.aws.amazon.com/sdk-for-javascript/latest/developer-guide/) | 是 |  | 
| [适用于 JavaScript 2.x 的 SDK](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/) | 否 | 支持最大重试次数、带抖动的指数回退以及用于重试回退的自定义方法选项。 | 
| [适用于 Kotlin 的 SDK](https://docs.aws.amazon.com/sdk-for-kotlin/latest/developer-guide/) | 是 |  | 
| [适用于.NET 4.x 的 SDK](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/) | 是 |  | 
| [适用于 .NET 3.x 的 SDK](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/) | 是 |  | 
| [适用于 PHP 3.x 的 SDK](https://docs.aws.amazon.com/sdk-for-php/latest/developer-guide/) | 是 |  | 
| [适用于 Python (Boto3) 的 SDK](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html) | 是 |  | 
| [适用于 Ruby 3.x 的 SDK](https://docs.aws.amazon.com/sdk-for-ruby/latest/developer-guide/) | 是 |  | 
| [适用于 Rust 的 SDK](https://docs.aws.amazon.com/sdk-for-rust/latest/dg/) | 是 |  | 
| [适用于 Swift 的 SDK](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/) | 是 |  | 