Implementarea backoff exponențial cu jitter
Integrezi un API de plăți terț care returnează uneori erori tranzitorii. Pentru a evita supraîncărcarea serviciului atunci când acesta este deja instabil, vei implementa o strategie de reîncercare bazată pe backoff exponențial cu jitter complet — crești timpul de așteptare între încercări și adaugi un element aleatoriu, astfel încât mai mulți clienți să nu reîncerce toți în același moment.
Funcția flaky_call(payload) este disponibilă: eșuează cu TransientError la primele 3 apeluri, apoi reușește la al 4-lea. time, random și TransientError sunt deja importate.
Acest exercițiu face parte din cursul
Dezvoltarea aplicațiilor pe AWS
Instrucțiuni pentru exercițiu
- În blocul
try, apeleazăflaky_callcupayloadși returnează rezultatul. - Calculează limita exponențială pentru această încercare folosind
baseși valoarea curentă a contoruluiattempt. - Aplică jitter complet alegând un timp de așteptare aleatoriu între
0șicapcu ajutorulrandom.uniform().
Exercițiu interactiv practic
Încearcă acest exercițiu completând acest cod de exemplu.
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)