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

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

重试行为

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

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

max_attempts - 共享 Amazon config 文件设置
AWS_MAX_ATTEMPTS - 环境变量

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

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

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

  • 如果retry_modestandard – 尝试三次。

  • 如果retry_modeadaptive – 尝试三次。

有效值:大于 0 的数字。

retry_mode - 共享 Amazon config文件设置
AWS_RETRY_MODE - 环境变量

指定 SDK 或开发人员工具如何尝试重试。

默认值:legacy是默认的重试策略。

有效值

  • legacy – 特定于您的 SDK(请查看您的特定 SDK 指南或 SDK 的代码库)。

  • standard – 跨 Amazon SDK 的标准重试规则集。此模式包括一组标准的重试错误,并支持重试配额。除非max_attempts明确配置,否则此模式下默认的最大尝试次数为三次。

  • 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 客户端可配置为快速失败请求或在令牌可用之前进行阻止。

客户端速率限制是一种算法,它最初允许以不超过令牌限额的任何速率发出请求。但是,在检测到受限的响应后,客户端就会 rate-of-request 受到相应的限制。如果收到成功的响应,令牌限额也会相应增加。

通过自适应速率限制,SDK 可以降低请求的发送速率,以便更好地容纳 Amazon Web Services 的容量。

SendHTTPRequest:

大多数 Amazon SDK 使用那些使用连接池的 HTTP 库,这样您就可以在发出 HTTP 请求时重复使用现有连接。通常,由于节流错误,在重试请求时会重复使用连接。由于瞬时错误,在重试时不会重复使用请求。

RequestBookkeeping:

如果请求成功,则应更新重试配额。仅在adaptive重试模式下,状态变量 maxsendrate 会根据收到的响应类型进行更新。

Retryable:

此步骤根据以下内容确定是否可以重试响应:

  • HTTP 状态代码 。

  • 从服务返回的错误代码。

  • 连接错误,定义为 SDK 收到的任何错误,其中未收到来自服务的 HTTP 响应。

瞬时错误(HTTP 状态代码 400、408、500、502、503 和 504)和节流错误(HTTP 状态代码 400、403、429、502、503 和 509)都可能被重试。SDK 重试行为是结合错误代码或服务中的其他数据确定的。

MAX_ATTEMPTS:

config文件设置或环境变量指定。

HasRetryQuota

此步骤要求在重试配额桶中提供令牌,从而节流重试请求。重试配额桶是一种防止不太可能成功的重试的机制。这些配额依赖于 SDK,通常依赖于客户端,有时甚至依赖于服务端点。当请求由于各种原因失败时,可用的重试配额令牌将被移除,并在请求成功时补充。当没有剩余令牌时,将退出重试循环。

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 支持本主题中所述的功能和设置。所有部分例外情况均已注明。