CommencezCommencez gratuitement

Implémenter un repli exponentiel avec gigue

Vous vous intégrez à une API de paiement tierce instable qui renvoie parfois des erreurs passagères. Pour éviter de marteler le service lorsqu'il est déjà en difficulté, vous allez mettre en place une stratégie de réessai qui utilise un repli exponentiel avec gigue complète, en augmentant l'attente entre les tentatives tout en ajoutant de l'aléatoire afin qu'une cohorte de clients ne réessaie pas tous au même instant.

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

Cette activité fait partie du cours

Développer des applications sur AWS

Voir le cours

Instructions de l’exercice

  • À l'intérieur du bloc try, appelez flaky_call avec payload et retournez son résultat.
  • Calculez la limite exponentielle pour cette tentative à l'aide de base et du nombre de attempt courant.
  • Appliquez une gigue complète 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