Exponential apiCallAttemptTimeout in AWS SDK for Java V2



我目前正在使用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包括一个新的ADAPTIVERetryMode选项,但我的理解是,这只适用于当你是由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();

相关内容

  • 没有找到相关文章

最新更新