Implementando exponential backoff com jitter
Você está integrando com uma API de pagamentos de terceiros instável, que às vezes retorna erros transitórios. Para evitar sobrecarregar o serviço quando ele já está com dificuldades, você vai implementar uma estratégia de novas tentativas que usa exponential backoff com full jitter, aumentando o tempo de espera entre as tentativas e adicionando aleatoriedade para que uma "manada" de clientes não tente novamente exatamente no mesmo instante.
Uma função flaky_call(payload) está disponível: ela falha com TransientError nas 3 primeiras invocações e tem sucesso na 4ª. time, random e TransientError já estão carregados.
Este exercicio faz parte do curso
Desenvolvendo Aplicações na AWS
Instruções do exercicio
- Dentro do bloco
try, chameflaky_callcompayloade retorne o resultado. - Calcule o limite exponencial para esta tentativa usando
basee a contagem atual deattempt. - Aplique full jitter escolhendo uma espera aleatória entre
0ecapusandorandom.uniform().
exercicio interativo prático
Tente este exercicio completando este código de exemplo.
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)