Реализация экспоненциальной задержки с джиттером
Вы интегрируетесь со сторонним API платежей, который периодически возвращает временные ошибки. Чтобы не перегружать сервис в момент, когда он и так испытывает трудности, вы реализуете стратегию повторных попыток с экспоненциальной задержкой и полным джиттером: интервал между попытками будет увеличиваться, а случайность не позволит всем клиентам обратиться к сервису одновременно.
Доступна функция flaky_call(payload): она завершается с ошибкой TransientError при первых трёх вызовах, а на четвёртый — выполняется успешно. Модули 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)