本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
重试行为
重试行为包括有关如何尝试从因向其SDKs发出请求而导致的失败中恢复的设置 Amazon Web Services 服务.
使用以下方法配置此功能:
retry_mode
-共享 Amazonconfig
文件设置AWS_RETRY_MODE
- 环境变量aws.retryMode
-JVM 系统属性:仅限 Java/Kotlin-
指定SDK或开发者工具如何尝试重试。
默认值:此值特定于您的SDK。请查看您的特定SDK指南或您的SDK代码库以了解其默认值
retry_mode
。有效值:
-
standard
—(推荐)推荐的重试规则集 Amazon SDKs。此模式包括一组标准的重试错误,并自动调整重试次数以最大限度地提高可用性和稳定性。此模式可在多租户应用程序中安全使用。除非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指南或代码库以了解max_attempts
默认值)。SDK -
如果
retry_mode
是standard
– 尝试三次。 -
如果
retry_mode
是adaptive
– 尝试三次。
有效值:大于 0 的数字。
-
在standard
和adaptive
重试模式之间进行选择
除非您确定自己的用法更适合,否则我们建议您使用standard
重试模式。adaptive
注意
该adaptive
模式假设您正在根据后端服务可能限制请求的范围来池化客户端。如果你不这样做,那么如果你对两个资源使用同一个客户端,那么一个资源中的限制可能会延迟对不相关资源的请求。
Standard | 自适应 |
---|---|
应用程序用例:全部。 | 应用程序用例:
|
支持断路以防止在SDK中断期间重试。 | 支持断路以防止在SDK中断期间重试。 |
在出现故障时使用抖动指数退避。 | 使用动态退避持续时间来尝试最大限度地减少失败请求的数量,以换取延迟增加的可能性。 |
永远不要延迟第一次请求尝试,只会延迟重试。 | 可以限制或延迟初始请求尝试。 |
如果您选择使用adaptive
模式,则您的应用程序必须围绕可能受到限制的每种资源构建客户端。在这种情况下,对资源的调整要比仅仅考虑每种资源都要精细 Amazon Web Services 服务. Amazon Web Services 服务 可以有其他维度来限制请求。让我们以亚马逊 DynamoDB 服务为例。DynamoDB 使用 Amazon Web Services 区域 再加上用于限制请求的访问表。这意味着您的代码正在访问的一个表可能比其他表更受限制。如果您的代码使用同一个客户端访问所有表,并且对其中一个表的请求受到限制,则自适应重试模式将降低所有表的请求速率。您的代码应设计为每个 R egion-and-table 对都有一个客户端。如果您在使用adaptive
模式时遇到意外延迟,请参阅具体的 Amazon 您正在使用的服务的文档指南。
重试模式实现细节
这些区域有: Amazon SDKs使用令牌桶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 SDKs在HTTP发出请求时,使用使用连接池重用现有连接的HTTP库。通常,如果请求由于限制错误而失败,则会重复使用连接,但如果请求由于暂时性错误而失败,则不会重复使用连接。
RequestBookkeeping
:
如果请求成功,则会将令牌添加到令牌存储桶中。仅在adaptive
重试模式下,请求速率令牌存储桶的填充率会根据收到的响应类型进行更新。
Retryable
:
此步骤根据以下内容确定是否可以重试响应:
-
HTTP状态码。
-
从服务返回的错误代码。
-
连接错误,定义为收到的任何未收到服务HTTP响应的错误。SDK
暂时错误(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指南或源代码进行确认。
与之兼容 Amazon SDKs
以下内容SDKs支持本主题中描述的功能和设置。所有部分例外情况均已注明。支持任何JVM系统属性设置 Amazon SDK for Java 还有 Amazon SDK for Kotlin 只有。
SDK | 支持 | 备注或更多信息 |
---|---|---|
Amazon CLI v2 | 是 | |
SDK对于 C++ | 是 | |
SDK适用于 Go V2 (1.x) |
是 | |
SDK适用于 Go 1.x (V1) | 否 | |
SDK适用于 Java 2.x | 是 | |
SDK适用于 Java 1.x | 是 | JVM系统属性:使用com.amazonaws.sdk.maxAttempts 代替aws.maxAttempts ;使用com.amazonaws.sdk.retryMode 代替aws.retryMode 。 |
SDK适用于 JavaScript 3.x | 是 | |
SDK适用于 JavaScript 2.x | 否 | 支持最大重试次数、带抖动的指数回退以及用于重试回退的自定义方法选项。 |
SDK对于 Kotlin 来说 | 是 | |
SDK对于。 NET3.x | 是 | |
SDK适用于 PHP 3.x | 是 | |
SDK适用于 Python (Boto3) |
是 | |
SDK适用于 Ruby 3.x | 是 | |
SDK对于 Rust | 是 | |
SDK为斯威夫特 | 是 | |
用于 PowerShell | 是 |