Реалізація експоненційного відступу з джиттером
Ви інтегруєтеся з ненадійним стороннім API платежів, який іноді повертає тимчасові помилки. Щоб не навантажувати сервіс, коли він і так „задихається", ви реалізуєте стратегію повторних спроб з експоненційним відступом і повним джиттером: інтервал між спробами зростає, а випадковість допомагає уникнути ситуації, коли ціла хвиля клієнтів повторює запит одночасно.
Доступна функція flaky_call(payload): вона завершується з TransientError у перших 3 викликах, а на 4-му — успішна. time, random і TransientError уже імпортовано.
Ця вправа є частиною курсу
Розроблення застосунків на AWS
Інструкції до вправи
- У блоці
tryвикличтеflaky_callзpayloadі поверніть результат. - Обчисліть експоненційну верхню межу для цієї спроби, використавши
baseі поточне значення лічильникаattempt. - Застосуйте повний джиттер: виберіть випадковий час очікування між
0таcapза допомогоюrandom.uniform().
Інтерактивна практична вправа
Спробуйте виконати цю вправу, доповнивши цей зразок коду.
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)