在适用于 Rust 的 AWS SDK 中配置重试 - 适用于 Rust 的 AWS SDK

在适用于 Rust 的 AWS SDK 中配置重试

适用于 Rust 的 AWS SDK 为服务请求提供了默认的重试行为和可自定义的配置选项。调用 AWS 服务偶尔会返回意外异常。如果重试调用,某些类型的错误(例如节流或暂时错误)可能会成功。

重试行为可以使用共享 AWS config 文件中的环境变量或设置进行全局配置。有关此方法的信息,请参阅《AWS SDK 和工具参考指南》中的重试行为。它还包括有关重试策略实现以及如何选择一种策略而不是另一种策略的详细信息。

或者,您也可以在代码中配置这些选项,如以下部分所示。

默认重试配置

每个服务客户端都默认使用通过 RetryConfig 结构提供的 standard 重试策略配置。默认情况下,一个调用将尝试三次(初次尝试加上两次重试)。此外,为了避免重试风暴,每次重试都将随机延迟一小段时间。此约定适用于大多数使用案例,但可能不适用于特定情况,例如高吞吐量系统。

SDK 仅将部分类型的错误视为可重试错误。可重试错误示例如下:

  • 套接字超时

  • 服务端节流

  • 暂时性服务错误,例如 HTTP 5XX 响应

以下示例不属于 可重试范畴:

  • 参数缺失或无效

  • 身份验证/安全错误

  • 配置错误异常

您可以通过设置最大尝试次数、延迟和回退配置来自定义 standard 重试策略。

最大尝试次数

您可以通过向 aws_config::defaults 提供修改后的 RetryConfig 来自定义代码中的最大尝试次数:

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;

延迟和回退

如果需要重试,默认的重试策略会在进行下一次尝试之前等待一段时间。第一次重试的延迟时间很短,但后续重试的延迟时间会呈指数级增长。最长延迟时间是有上限的,以防延迟时间过长。

系统会将随机抖动应用于所有尝试之间的延迟。抖动有助于降低可能导致重试风暴的大量重试的影响。有关指数回退和抖动的更深入讨论,请参阅 AWS 架构博客中的指数回退和抖动

您可以通过向 aws_config::defaults 提供修改后的 RetryConfig 来自定义代码中的延迟设置。以下代码将延迟配置设置为第一次重试尝试最多延迟 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 SDK 和工具参考指南》中的重试行为

自适应重试具备标准重试的所有功能。它添加了一个客户端速率限制器,用于衡量节流请求与非节流请求的比率。它还会限制尝试流量以保持在安全带宽内,理想情况下会使节流错误为零。

该速率会根据不断变化的服务条件和流量模式实时调整,并可能相应地增加或减少流量速率。至关重要的是,在高流量场景中,速率限制器可能会延迟初始尝试。

您可以通过提供修改后的 RetryConfig 来选择代码中的 adaptive 重试策略:

let config = aws_config::defaults(BehaviorVersion::latest()) .retry_config(RetryConfig::adaptive()) .load() .await;