Amazon Web Services 中的 API 重试逻辑

Posted

技术标签:

【中文标题】Amazon Web Services 中的 API 重试逻辑【英文标题】:API retry logic in Amazon Web Services 【发布时间】:2017-02-28 15:34:33 【问题描述】:

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

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

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

【问题讨论】:

Java SDK 没有默认机制。亚马逊人用 Java 编写的 AWS 开发工具包代码默认包含客户端请求的重试。这意味着,如果客户端请求由于某些错误(如服务器忙、节流等)而无法连接到服务器,它将重试建立连接。可以使用ClientConfiguration 类配置尝试次数。 如果您使用的是 java sdk,自动重试不适用。如果您使用 aws sdk,则会应用自动回复。 【参考方案1】:

相同的文档页面说:

AWS SDK for Java 自动重试请求,您可以使用 ClientConfiguration 类配置重试设置。

您应该查看ClientConfiguration 的官方文档,它有很多方法可以调整其有关重试逻辑的行为。以下是最重要的:

withMaxErrorRetry 为失败的可重试请求设置最大重试次数(例如:来自服务的 5xx 错误响应) withRequestTimeout 设置在放弃和超时之前等待请求完成的时间(以毫秒为单位)[...] withThrottledRetries 重试限制是一项功能,当大部分请求失败且重试不成功时,它可以智能地限制重试尝试 [...] withRetryPolicy 这是最有趣的,它允许您选择RetryPolicy 并更改: BackoffStrategy 提供自定义退避策略以控制重试之间的睡眠时间的钩子 RetryCondition 提供关于是否应重试失败请求的自定义条件的钩子 maxErrorRetry honorMaxErrorRetryInClientConfig(是否尊重上述配置设置)

另外请注意,如果您没有注意到自动重试机制,可能是由于客户端错误。这些设置仅用于在服务器 (5xx) 或限制错误的情况下重试请求:

客户端错误 (4xx) 表示您需要修改请求以更正问题,然后再重试

如果您声称是“服务端”失败,您应该提供一些代码来重现该情况并分析实际发生​​的情况。


现在关于默认值:

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

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

【讨论】:

我是 AWS 新手,我的要求是在不同的存储桶之间进行复制,如果在复制或读取对象时发生任何异常,方法应该重试。我正在使用 spring boot、java、aws sdk 1.11.x。你能提供任何例子吗? 很抱歉,但我认为如果您有一些具体问题未包含在此一般答案中,您应该将其作为问题发布(提及这一问题),以便单独回答。跨度>

以上是关于Amazon Web Services 中的 API 重试逻辑的主要内容,如果未能解决你的问题,请参考以下文章

在 Java EE 中实现 Amazon Web Services 的在线照片处理服务示例

Amazon Web Services 与这些 Azure Web Services 最相似的是啥

将数据从 CSV 文件导入 Amazon Web Services RDS MySQL 数据库

Overview of Amazon Web Services

帮助了解 Amazon Web Services 定价

使用 Amazon Web Services 保守秘密密钥