本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
AWS SDK for Rust 提供了默认的重试行为和可自定义的配置选项。调用 AWS 服务 偶尔会返回意外异常。如果重试呼叫,某些类型的错误(例如限制或暂时错误)可能会成功。
重试行为可以使用共享 AWS config
文件中的环境变量或设置进行全局配置。有关此方法的信息,请参阅《工具参考指南》AWS SDKs 和《工具参考指南》中的重试行为。它还包括有关重试策略实现以及如何选择一种策略而不是另一种策略的详细信息。
或者,也可以在代码中配置这些选项,如以下各节所示。
默认重试配置
每个服务客户端都默认为通过RetryConfig
standard
重试策略配置。默认情况下,一个呼叫将尝试三次(初次尝试加上两次重试)。此外,为了避免重试风暴,每次重试都将随机延迟一小段时间。此约定适用于大多数用例,但可能不适用于特定情况,例如高吞吐量系统。
只有某些类型的错误被认为是可重试的。 SDKs可重试错误的示例有:
-
套接字超时
-
服务端限制
-
诸如 HTTP 5XX 响应之类的临时服务错误
以下示例不被视为可重试:
-
参数缺失或无效
-
身份验证/安全错误
-
配置错误异常
您可以通过设置最大standard
尝试次数、延迟时间和退避配置来自定义重试策略。
最大尝试次数
您可以通过提供修改后的RetryConfig
aws_config::defaults
:
const CUSTOM_MAX_ATTEMPTS: u32 = 5;
let retry_config = RetryConfig::standard()
// Set max attempts. When max_attempts is 1, there are no retries.
// This value MUST be greater than zero.
// Defaults to 3.
.with_max_attempts(CUSTOM_MAX_ATTEMPTS);
let config = aws_config::defaults(BehaviorVersion::latest())
.retry_config(retry_config)
.load()
.await;
延迟和退缩
如果需要重试,则默认的重试策略会等待,然后再进行后续尝试。第一次重试的延迟很小,但是对于以后的重试,延迟会呈指数级增长。最大延迟量是有上限的,这样它就不会变得太大。
随机抖动适用于所有尝试之间的延迟。抖动有助于减轻可能导致重试风暴的大型舰队的影响。有关指数退避和抖动的更深入讨论,请参阅架构博客中的指数退避和抖
您可以通过向您的代码提供修改后的RetryConfig
aws_config::defaults
。以下代码将配置设置为将第一次重试尝试最多延迟 100 毫秒,并且任何重试尝试之间的最大间隔为 5 秒。
let retry_config = RetryConfig::standard()
// Defaults to 1 second.
.with_initial_backoff(Duration::from_millis(100))
// Defaults to 20 seconds.
.with_max_backoff(Duration::from_secs(5));
let config = aws_config::defaults(BehaviorVersion::latest())
.retry_config(retry_config)
.load()
.await;
自适应重试模式
作为模式重试策略的替代方案,standard
adaptive
模式重试策略是一种高级方法,它寻求理想的请求速率以最大限度地减少限制错误。
注意
自适应重试是一种高级重试模式。通常不建议使用此策略。请参阅《工具参考指南》AWS SDKs 和《工具参考指南》中的重试行为。
自适应重试包括标准重试的所有功能。它添加了一个客户端速率限制器,用于衡量受限制请求与非限制请求的比率。它还会限制流量以尝试保持在安全带宽内,理想情况下会导致节流错误为零。
该速率会实时适应不断变化的服务条件和交通模式,并可能相应地增加或降低流量速率。至关重要的是,在高流量场景中,速率限制器可能会延迟初始尝试。
您可以通过提供修改后的RetryConfig
adaptive
重试策略:
let config = aws_config::defaults(BehaviorVersion::latest())
.retry_config(RetryConfig::adaptive())
.load()
.await;