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>Instructions de l’exercice
- Dans le bloc
try, appelezflaky_callavecpayloadet retournez son résultat. - Calculez la limite exponentielle pour cette tentative en utilisant
baseet le nombre courant deattempt. - Appliquez un jitter complet 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)