重试行为
注意
如需获得相关帮助,以了解设置页面的布局或解释后面的 Amazon SDK 和工具支持表,请参阅了解本指南的设置页面。
重试行为包括有关 SDK 如何尝试从向 Amazon Web Services 服务 发出的请求而导致的失败中恢复的设置。
使用以下方法配置此功能:
retry_mode- 共享 Amazonconfig文件设置AWS_RETRY_MODE- 环境变量aws.retryMode:JVM 系统属性,仅适用于 Java/Kotlin-
指定 SDK 或开发人员工具如何尝试重试。
默认值:此值因具体 SDK 而异。请查看具体的 SDK 指南或 SDK 代码库,以了解其默认
retry_mode。有效值:
-
standard:(推荐)适用于各种 Amazon SDK 的推荐重试规则集。此模式包括要重试的标准错误集,并且会自动调整重试次数以尽可能提高可用性和稳定性。此模式可在多租户应用程序中安全使用。除非max_attempts明确配置,否则此模式下默认的最大尝试次数为三次。 -
adaptive:此重试模式仅适用于特殊使用案例,包含标准模式的功能以及自动客户端速率限制。除非您注意隔离应用程序租户,否则不建议将此重试模式用于多租户应用程序。请参阅可选择 standard 和 adaptive 重试模式了解更多信息。此模式处于实验阶段,未来可能会改变行为。 -
legacy:(不推荐)因 SDK 而异(请查看具体 SDK 指南或 SDK 代码库)。
-
max_attempts- 共享 Amazonconfig文件设置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 重试模式
除非您确定自己的使用情况更适合 adaptive,否则我们建议您使用 standard 重试模式。
注意
adaptive 模式假设您会根据后端服务可能限制请求的范围来池化客户端。如果不是这种情况,则在将同一客户端同时用于两个资源时,对其中一个资源进行节流可能会导致对不相关资源的请求出现延迟。
| Standard | 自适应 |
|---|---|
| 应用程序使用案例:全部。 | 应用程序使用案例:
|
| 支持通过熔断来防止 SDK 在中断期间重试。 | 支持通过熔断来防止 SDK 在中断期间重试。 |
| 在出现故障时使用抖动指数回退。 | 使用动态退避时长来尝试减少失败请求数的量,以换取延迟增加的可能性。 |
| 永不推迟首次请求尝试,仅推迟重试。 | 可能会节流或推迟首次请求尝试。 |
如果选择使用 adaptive 模式,则应用程序构建的客户端必须围绕每种可能被节流的资源设计。在这种情况下,资源须经精细调整,而非仅仅是考虑每个 Amazon Web Services 服务。Amazon Web Services 服务 可能存在用来对请求节流的其他维度。下面以 Amazon DynamoDB 服务为例说明。DynamoDB 使用 Amazon Web Services 区域 和正在访问的表来进行请求节流。这意味着代码正在访问的一个表受到的节流可能比其他表更大。如果代码使用同一客户端来访问所有表,并且对其中一个表的请求受到节流,则自适应重试模式将降低所有表的请求速率。代码的设计应确保每个区域表对都有一个客户端。如果在使用 adaptive 模式时遇到预料之外的延迟,请参阅所用服务的具体 Amazon 文档指南。
重试模式实现详情
Amazon SDK 使用令牌存储桶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:
此步骤会将请求发送到 Amazon。大多数 Amazon 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:
默认的最大尝试次数通过设置 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 指南或源代码进行确认。
Amazon SDK 和工具支持
以下 SDK 支持本主题中所述的功能和设置。所有部分例外情况均已注明。任何 JVM 系统属性设置都仅支持 适用于 Java 的 Amazon SDK 和 适用于 Kotlin 的 Amazon SDK。
| SDK | 支持 | 备注或更多信息 |
|---|---|---|
| Amazon CLI v2 | 是 | |
| 适用于 C++ 的 SDK | 是 | |
| 适用于 Go V2 (1.x) 的 SDK |
是 | |
| 适用于 Go 1.x(V1)的 SDK | 否 | |
| 适用于 Java 2.x 的 SDK | 是 | |
| 适用于 Java 1.x 的 SDK | 是 | JVM 系统属性:使用 com.amazonaws.sdk.maxAttempts 而不是 aws.maxAttempts;使用 com.amazonaws.sdk.retryMode 而不是 aws.retryMode。 |
| 适用于 JavaScript 3.x 的 SDK | 是 | |
| 适用于 JavaScript 2.x 的 SDK | 否 | 支持最大重试次数、带抖动的指数回退以及用于重试回退的自定义方法选项。 |
| 适用于 Kotlin 的 SDK | 是 | |
| 适用于 .NET 4.x 的 SDK | 是 | |
| 适用于 .NET 3.x 的 SDK | 是 | |
| 适用于 PHP 3.x 的 SDK | 是 | |
| 适用于 Python (Boto3) 的 SDK |
是 | |
| 适用于 Ruby 3.x 的 SDK | 是 | |
| 适用于 Rust 的 SDK | 是 | |
| 适用于 Swift 的 SDK | 是 | |
| Tools for PowerShell V5 | 是 | |
| Tools for PowerShell V4 | 是 |