我目前正在使用Java v2(特别是v2.17.1)的AWS SDK和s3asynclient::getObject方法。
final GetObjectRequest getObjectRequest = GetObjectRequest.builder()
.bucket("my bucket")
.key("some key")
.overrideConfiguration(AwsRequestOverrideConfiguration.builder()
.apiCallAttemptTimeout(Duration.ofSeconds(1))
.build())
.build();
return s3AsyncClient
.getObject(getObjectRequest, AsyncResponseTransformer.toBytes())
.thenAppply(/* snipped for brevity */);
这通常工作得很好,但偶尔会出现这些错误:
software.amazon.awssdk.core.exception.ApiCallAttemptTimeoutException: HTTP request execution did not complete before the specified timeout configuration: 1000 millis
我目前在创建上面的s3AsyncClient
的构建器上有以下配置:
S3AsyncClient.builder()
// other options snipped for brevity
.overrideConfiguration(ClientOverrideConfiguration.builder()
.retryPolicy(RetryPolicy.builder()
.numRetries(2)
.build())
.build())
.build()
是否有一种方法可以使不同的apiCallAttemptTimeout
值根据重试尝试的次数而使用?换句话说,我如何使指数重试超时工作?
我知道一个新版本的SDK包括一个新的 。任何帮助都是感激的-谢谢!ADAPTIVE
RetryMode选项,但我的理解是,这只适用于当你是由AWS速率限制。我还看到部分S3代码可以指数级延迟重试之间的时间,但不是每次重试的超时
你几乎。
在AWS SDK v2中,RetryPolicy
&BackoffStrategy
是从V1延续过来的,尽管在如何配置它方面有一些小的不同。
构建器允许一些复杂和独特的配置,但通过深入研究文档,您将发现一组PredefinedBackoffStrategies
,其中一个是ExponentialBackoffStrategy
。
这个预定义的策略允许你设置基本(初始)延迟&然后是最大退避时间。您可以在创建客户端时设置。
这应该有帮助:
final int initialDelayInMilliSeconds = 1 * 1000;
final int maxDelayInMilliSeconds = 60 * 1000;
final PredefinedBackoffStrategies.ExponentialBackoffStrategy backoffStrategy =
new PredefinedBackoffStrategies.ExponentialBackoffStrategy(
initialDelayInMilliSeconds,
maxDelayInMilliSeconds
);
final RetryPolicy retryPolicy = RetryPolicy.builder()
.backoffStrategy((BackoffStrategy) backoffStrategy)
.build();
return S3AsyncClient.builder()
// other options snipped for brevity
.overrideConfiguration(ClientOverrideConfiguration.builder()
.retryPolicy(retryPolicy)
.build())
.build();