Retry backoff, Retry-After и jitter: задача на Python

Повторные запросы должны учитывать временный характер ошибки, ограничение числа попыток и паузу перед следующим вызовом. Exponential backoff увеличивает задержку, а jitter распределяет повторы клиентов во времени.

Значение Retry-After и локальная политика требуют явно заданного правила совместного применения. В упражнении оно приведено в условии. Рассчитайте расписание по готовой ленте событий: настоящий API не вызывается.

Это бесплатное упражнение из платного курса. Проверьте решение без регистрации. Объяснения и последовательная практика — в курсе «LLMOps & Evaluation: из песочницы в продакшн».

Задача: Backoff/Retry — расписание повторов с Retry-After и full-jitter

Цель. По «ленте» ответов мок-API построить детерминированное расписание ретраев и выдать сводку.

Формат ввода

  1. Строка 1: политика — expo или full-jitter.
  2. Строка 2: четыре значения через пробел — base factor cap seed.
    base > 0, factor ≥ 1, cap ≥ base (в секундах). seed — целое; для expo игнорируется.
  3. Строка 3: целое M (1..1000) — число ответов в ленте.
  4. Далее M строк: code retry_after, где code — HTTP-код (int), retry_after — секунды (float, 0 если нет заголовка).

Правила

  • Попытка №1 всегда в момент t=0.
  • Успех: любой код 2xx — останавливаемся.
  • Ретрай: коды 429 или 5xx — вычисляем задержку до следующей попытки.
    • Сырый бэкофф: raw = min(cap, base * factor^(k-1)), где k — номер ретрая (1 для первой паузы).
    • expo: delay = max(retry_after, raw).
    • full-jitter: delay = max(retry_after, U[0, raw)), где U — детерминированная последовательность из seed (обычный PRNG).
  • Неретраибельно: любой код, не попадающий под 2xx/429/5xx — прекращаем с неуспехом.
  • Время следующей попытки = предыдущее время + delay. Если это последняя строка ленты — задержку после неё не добавляем.

Формат вывода

Одна минифицированная JSON-строка с полями строго в порядке:

{"attempts":<int>,"schedule":[<num,...>],"total_delay":<num>,"status":<int>,"success":<bool>}
  • schedule — времена попыток в секундах, начиная с 0.
  • Числа округляйте до 3 знаков (математически) и печатайте без лишних нулей (например, 0.5, 5, 1.25, для нуля — 0).

Подсказки

  • 2xx распознавайте по десяткам: code // 100 == 2. Аналогично 5xx.
  • retry_after всегда неотрицателен; он «перебивает» меньший бэкофф.
  • Суммарную задержку считайте как сумму всех ожиданий между попытками.

 

РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи