API Retry Strategy

OUTSCALE SDKs for our APIs include built-in support for automatic retries with exponential backoff when encountering transient HTTP errors.

Supported SDKs

Retry logic is currently implemented in the following SDKs:

SDK Versions

Python

0.35.0 and up

JavaScript/TypeScript

All

Rust

1.18.0 and up

Go

3.0.0-alpha.1 and up

General Information

The SDK automatically retries requests that fail with the following HTTP status codes:

  • HTTP 429 Too Many Requests

    • Code 24 - ErrorOperationThrottledPerAccount: Request rate exceeded.

    • Code 25 - ErrorOperationThrottledPerCall: Request rate exceeded.

  • HTTP 500 Internal Server Error – Temporary server issue.

  • HTTP 503 Service Unavailable – ErrorOperationThrottledWholePlatform: Request rate exceeded.

For more information, see the Error Codes Reference page.

The retry mechanism is based on the behavior of urllib3.util.Retry. By default, it is configured as follows:

  • Maximum retries: 3

  • Backoff factor: 1

  • Backoff jitter: 3 s

Exponential Backoff

Exponential backoff is a strategy used to manage retries after the API returns a limit code.

The delay between each retry attempt increases exponentially. The rate limit is configured per API call per OUTSCALE account. To help mitigate concurrency issues when using a multithreaded program making API calls, jitter is added to the strategy.

It is calculated as follows:

{backoff factor} * (2 ** ({number of previous retries}))

Example of backoff and jitter settings:

Retry Attempt Wait Time (in seconds)

1st retry

Between 0 s and 3 s

2nd retry

Between 2 s and 5 s

3rd retry

Between 4 s and 7 s

Retry Customization

The retry behavior can be customized. You need to add or modify the following parameters:

  • max_retries: The maximum number of retry attempts before the request fails.

  • retry_backoff_factor: The multiplier for the exponential backoff delay.

  • retry_backoff_jitter: A value added to the delay to avoid all retries happening at the same time in multithreaded scenarios.

Customize the Python SDK

Example of customization for osc-sdk-python file:

    "eu2": {
        "access_key": "XXXX",
        "region_name": "eu-west-2",
        "secret_key": "XXXX",
        "max_retries": 3,
        "retry_backoff_factor": 1,
        "retry_backoff_jitter": 3
    }

Customize the Gateway Object

Example of customization for the Gateway object:

gw = Gateway(
    **{
        "profile": "eu2",
        "max_retries": 3,
        "retry_backoff_jitter": 8,
        "retry_backoff_factor": 3
    }
)

Related Page