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
Instructions de l’exercice
- À l'intérieur du bloc
try, appelezflaky_callavecpayloadet retournez son résultat. - Calculez la limite exponentielle pour cette tentative à l'aide de
baseet du nombre deattemptcourant. - Appliquez une gigue complète en choisissant une attente aléatoire entre
0etcapavecrandom.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)