НачатьНачать бесплатно

Реализация экспоненциальной задержки с джиттером

Вы интегрируетесь со сторонним 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)
Редактировать и запускать код