重试行为 - Amazon SDK 和工具
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

重试行为

注意

如需获得相关帮助,以了解设置页面的布局或解释后面的 Amazon SDK 和工具支持表,请参阅了解本指南的设置页面

重试行为包括有关 SDK 如何尝试从向 Amazon Web Services 服务 发出的请求而导致的失败中恢复的设置。

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

retry_mode - 共享 Amazon config 文件设置
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 - 共享 Amazon config文件设置
AWS_MAX_ATTEMPTS - 环境变量
aws.maxAttempts:JVM 系统属性,仅适用于 Java/Kotlin

指定对请求进行的最大尝试次数。

默认值:如果未指定此值,则其默认值取决于retry_mode设置的值:

  • 如果retry_modelegacy – 使用特定于 SDK 的默认值(请查看您的特定 SDK 指南或 SDK 的代码库以了解max_attempts默认值)。

  • 如果retry_modestandard – 尝试三次。

  • 如果retry_modeadaptive – 尝试三次。

有效值:大于 0 的数字。

可选择 standardadaptive 重试模式

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

注意

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

Standard 自适应
应用程序使用案例:全部。 应用程序使用案例:
  1. 对延迟不敏感。

  2. 客户端只能访问单个资源,或者您要提供一种逻辑来按正在访问的服务资源分别池化客户端。

支持通过熔断来防止 SDK 在中断期间重试。 支持通过熔断来防止 SDK 在中断期间重试。
在出现故障时使用抖动指数回退。 使用动态退避时长来尝试减少失败请求数的量,以换取延迟增加的可能性。
永不推迟首次请求尝试,仅推迟重试。 可能会节流或推迟首次请求尝试。

如果选择使用 adaptive 模式,则应用程序构建的客户端必须围绕每种可能被节流的资源设计。在这种情况下,资源须经精细调整,而非仅仅是考虑每个 Amazon Web Services 服务。Amazon Web Services 服务 可能存在用来对请求节流的其他维度。下面以 Amazon DynamoDB 服务为例说明。DynamoDB 使用 Amazon Web Services 区域 和正在访问的表来进行请求节流。这意味着代码正在访问的一个表受到的节流可能比其他表更大。如果代码使用同一客户端来访问所有表,并且对其中一个表的请求受到节流,则自适应重试模式将降低所有表的请求速率。代码的设计应确保每个区域表对都有一个客户端。如果在使用 adaptive 模式时遇到预料之外的延迟,请参阅所用服务的具体 Amazon 文档指南。

重试模式实现详情

Amazon SDK 使用令牌存储桶来决定是否应重试请求以及(对于 adaptive 重试模式)发送请求的速率。SDK 会使用两个令牌存储桶:一个为重试令牌存储桶,另一个为请求速率令牌存储桶。

  • 重试令牌存储桶用于确定 SDK 是否应暂时禁用重试,以便在中断期间保护上游和下游服务。系统会在尝试重试之前从该存储桶中获取令牌,然后在请求成功后将令牌归还到该存储桶。如果尝试重试时该存储桶为空,则 SDK 将不会重试该请求。

  • 请求速率令牌存储桶仅在 adaptive 重试模式下用于确定发送请求的速率。系统会在发送请求之前从该存储桶中获取令牌,并根据服务返回的节流响应,以动态确定的速率将令牌归还到该存储桶。

以下是standardadaptive两种重试模式的高级伪代码:

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