Implementera exponentiell backoff med jitter
Du integrerar med ett opålitligt betalnings-API från en tredjepartsleverantör som ibland returnerar tillfälliga fel. För att undvika att överbelasta tjänsten när den redan är hårt belastad ska du implementera en återförsöksstrategi med exponentiell backoff och full jitter – väntetiden ökar för varje försök och slumpmässigheten gör att en grupp klienter inte alla försöker igen exakt samtidigt.
Funktionen flaky_call(payload) är tillgänglig: den misslyckas med TransientError vid de första 3 anropen och lyckas vid det 4:e. time, random och TransientError är redan inladdade.
Den här övningen är en del av kursen
Utveckla applikationer på AWS
Övningsinstruktioner
- Inuti
try-blocket anropar duflaky_callmedpayloadoch returnerar resultatet. - Beräkna det exponentiella taket för det aktuella försöket med hjälp av
baseoch det nuvarande värdet påattempt. - Applicera full jitter genom att välja en slumpmässig väntetid mellan
0ochcapmedrandom.uniform().
Interaktiv övning med praktiskt arbete
Testa den här övningen genom att slutföra den här exempelkoden.
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)