亚马逊网络服务中的API重试逻辑

25

http://docs.aws.amazon.com/zh_cn/general/latest/gr/api-retries.html

该文档提到“每个 AWS SDK 实现了自动重试逻辑,Java 的 AWS SDK 自动重试请求。”

如果我没有指定任何重试配置,Java AWS SDK 的默认机制是什么?我一直在使用 Java AWS SDK,如果 AWS 服务端发生故障,我会收到一个简单的服务异常,但从未遇到过任何“自动”重试机制。有人能解释一下这个重试机制吗?


2
Java SDK 没有默认的机制。由亚马逊工程师用 Java 编写的 AWS SDK 代码已经默认包含了客户端请求的重试功能。这意味着,如果客户端请求由于某些错误(如服务器繁忙、被限流等)而无法连接到服务器,则会尝试重新建立连接。可以使用 ClientConfiguration 类配置重试次数。 - Abhineet
1
如果您正在使用Java SDK,则不适用自动重试。只有在使用AWS SDK时,自动重试才适用。 - notionquest
1个回答

34
同一份文档页面还提到:
AWS SDK for Java会自动重试请求,您可以使用ClientConfiguration类配置重试设置。
您应该查看官方文档ClientConfiguration,其中有很多方法可以调整其关于重试逻辑的行为。以下是最重要的:
  • withMaxErrorRetry 设置重试失败的可重试请求(例如服务端5xx错误响应)的最大重试次数
  • withRequestTimeout 设置等待请求完成的超时时间(以毫秒为单位),在超时后放弃请求并结束
  • withThrottledRetries 重试限流是一种智能的限制重试尝试的功能,当大量请求失败且重试不成功时使用
  • withRetryPolicy 这是最有趣的部分,它允许您选择RetryPolicy并更改:
    • BackoffStrategy 提供自定义退避策略来控制重试之间的休眠时间的钩子
    • RetryCondition 提供自定义条件来决定是否应该重试失败的请求的钩子
    • maxErrorRetry
    • honorMaxErrorRetryInClientConfig(是否要遵守上述配置设置)
请注意,如果您没有注意到自动重试机制,可能是由于客户端错误导致的。这些设置仅用于在服务器(5xx)或限流错误的情况下重试请求:

客户端错误(4xx)表示您需要修正请求以在再次尝试之前解决问题

如果您声称是“服务端”出现了故障,应提供一些代码以重现情况并分析实际发生的情况。

关于默认值:

如果我没有指定任何重试配置,Java SDK的默认机制是什么?

您可以查找常量字段ClientConfiguration的默认值。但请注意,它可能因您使用的服务而异(特别是DynamoDB是一个特殊情况)。还要检查PredefinedClientConfigurationsPredefinedRetryPolicies类。


我是AWS的新手,我的需求是在不同的存储桶之间进行复制,如果在复制或读取对象时出现任何异常,方法应该重试。我正在使用Spring Boot、Java和AWS SDK 1.11.x。你能否提供任何相关示例? - sk.bng88
很抱歉,但我认为如果您有一些特定问题没有在这个通用答案中涵盖,您应该将其作为一个问题发布(提到这个问题),这样它可以被单独回答。 - laughedelic
文档提到“客户端错误(4xx)表示您需要修改请求以在再次尝试之前纠正问题”。值得注意的是,这似乎可能是错误的。我正在使用AWS Java SDK Cloudwatch客户端(AmazonCloudWatch)1.12,如果您过度使用它,您将收到一个400 AmazonServiceException,其中包含“错误代码:限流”。这是AWS端的限流异常-应该是5xx错误,而不是400错误。不幸的是,对于这些错误,必须构建自己的重试逻辑。 - Zachary Steudel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接