CommencerCommencez gratuitement

Mettre en œuvre un backoff exponentiel avec jitter

Vous vous intégrez à une API de paiement tierce instable qui renvoie parfois des erreurs transitoires. Pour éviter d'écraser le service lorsqu'il est déjà en difficulté, vous allez implémenter une stratégie de nouvelle tentative utilisant un backoff exponentiel avec jitter complet, qui augmente l'attente entre les tentatives tout en ajoutant de l'aléa pour éviter qu'une nuée de clients ne relancent tous au même instant.

Une fonction flaky_call(payload) est disponible : elle échoue avec TransientError lors des 3 premières invocations, puis réussit à la 4e. time, random et TransientError sont déjà chargés.

Cet exercice fait partie du cours

<cours>Développer des applications sur AWS</cours>
Voir le cours

Instructions de l’exercice

  • Dans le bloc try, appelez flaky_call avec payload et retournez son résultat.
  • Calculez la limite exponentielle pour cette tentative en utilisant base et le nombre courant de attempt.
  • Appliquez un jitter complet en choisissant une attente aléatoire entre 0 et cap avec random.uniform().

Exercice interactif pratique

Essayez cet exercice en complétant ce code d’exemple.

def retry_with_backoff(payload, max_attempts=5, base=0.2):
    last_error = None
    for attempt in range(max_attempts):
        try:
            # Try the call
            return ____(payload)
        except TransientError as err:
            last_error = err
            # Cap grows exponentially with each attempt
            cap = ____ * (2 ** attempt)
            # Pick a random wait between 0 and cap (full jitter)
            wait = random.____(0, cap)
            time.sleep(wait)
    # All attempts failed; surface the last error
    raise last_error


result = retry_with_backoff({"order_id": 42})
print(result)
Modifier et exécuter le code