Retry policy configuration

Updated at:
Copy as MD

Calls to Alibaba Cloud services can fail transiently due to throttling or temporary service errors. Configuring a retry policy on the Java asynchronous SDK client lets you recover from these failures automatically.

Configuration

Pass a RetryPolicy to overrideConfiguration when building the AsyncClient. The policy controls three things: the backoff strategy, the retry conditions, and the maximum number of retries.

AsyncClient client = AsyncClient.builder()
        .credentialsProvider(provider)
        .overrideConfiguration(
                darabonba.core.client.ClientOverrideConfiguration.create()
                        // Set the retry policy
                        .setRetryPolicy(darabonba.core.policy.retry.RetryPolicy.builder()
                                .backoffStrategy(darabonba.core.policy.retry.backoff.BackoffStrategy.defaultStrategy())
                                .retryCondition(darabonba.core.policy.retry.conditions.RetryCondition.defaultRetryCondition())
                                .numRetries(3)
                                .build()
                        )
        )
        .build();

The default policy retries up to 3 times, uses exponential backoff with full jitter (base delay 100 ms, cap 20,000 ms), and triggers on HTTP status codes 408, 429, 500, 502, 503, and 504 or on AliyunException or IOException.

Parameters

BackoffStrategy

BackoffStrategy computes the delay before each retry attempt using exponential backoff with full jitter. To use the default strategy, call BackoffStrategy.defaultStrategy(). To customize it, build a FullJitterBackoffStrategy directly:

darabonba.core.policy.retry.backoff.FullJitterBackoffStrategy.builder()
        .baseDelay(java.time.Duration.ofMillis(100))
        .maxBackoffTime(java.time.Duration.ofMillis(20000))
        .build();
  • baseDelay: The base delay. Retry intervals grow exponentially from this value. The default value is 100 ms.

  • maxBackoffTime: The maximum retry delay. Delays are capped at this value once exponential growth exceeds it. The default value is 20,000 ms.

RetryCondition

RetryCondition determines which responses trigger a retry. Two built-in condition types are available:

  • StatusCodeCondition — retries on HTTP status codes 408, 429, 500, 502, 503, and 504.

  • ExceptionsCondition — retries on AliyunException and IOException.

A retry is triggered if either condition is met (OR logic) by default.

To customize retry conditions, combine conditions using AndRetryCondition or OrRetryCondition. Both accept a custom set of conditions that replaces the default condition set rather than extending it.

Use AndRetryCondition when a retry should fire only if all specified conditions are met simultaneously:

darabonba.core.policy.retry.conditions.AndRetryCondition.create(RetryCondition... conditions)

Example:

java.util.Set<Integer> statusCodeConditions = new java.util.HashSet<>();
statusCodeConditions.add(408);
statusCodeConditions.add(429);
statusCodeConditions.add(500);
statusCodeConditions.add(502);
statusCodeConditions.add(503);
statusCodeConditions.add(504);
darabonba.core.policy.retry.conditions.StatusCodeCondition statusCodeCondition = darabonba.core.policy.retry.conditions.StatusCodeCondition.create(statusCodeConditions);
java.util.Set<Class<? extends Exception>> exceptionsConditions = new java.util.HashSet<>();
exceptionsConditions.add(com.aliyun.core.exception.AliyunException.class);
exceptionsConditions.add(java.io.IOException.class);
darabonba.core.policy.retry.conditions.ExceptionsCondition exceptionsCondition = darabonba.core.policy.retry.conditions.ExceptionsCondition.create(exceptionsConditions);
darabonba.core.policy.retry.conditions.AndRetryCondition andRetryCondition = darabonba.core.policy.retry.conditions.AndRetryCondition.create(statusCodeCondition, exceptionsCondition);

Use OrRetryCondition when a retry should fire if any of the specified conditions is met:

darabonba.core.policy.retry.conditions.OrRetryCondition.create(RetryCondition... conditions)

Example:

java.util.Set<Integer> statusCodeConditions = new java.util.HashSet<>();
statusCodeConditions.add(408);
statusCodeConditions.add(429);
statusCodeConditions.add(500);
statusCodeConditions.add(502);
statusCodeConditions.add(503);
statusCodeConditions.add(504);
darabonba.core.policy.retry.conditions.StatusCodeCondition statusCodeCondition = darabonba.core.policy.retry.conditions.StatusCodeCondition.create(statusCodeConditions);
java.util.Set<Class<? extends Exception>> exceptionsConditions = java.util.new HashSet<>();
exceptionsConditions.add(com.aliyun.core.exception.AliyunException.class);
exceptionsConditions.add(java.io.IOException.class);
darabonba.core.policy.retry.conditions.ExceptionsCondition exceptionsCondition = darabonba.core.policy.retry.conditions.ExceptionsCondition.create(exceptionsConditions);
darabonba.core.policy.retry.conditions.OrRetryCondition orRetryCondition = darabonba.core.policy.retry.conditions.OrRetryCondition.create(statusCodeCondition, exceptionsCondition);

numRetries

The maximum number of retry attempts. The default value is 3.