Retry backoff, Retry-After и jitter: задача на Python
Повторные запросы должны учитывать временный характер ошибки, ограничение числа попыток и паузу перед следующим вызовом. Exponential backoff увеличивает задержку, а jitter распределяет повторы клиентов во времени.
Значение Retry-After и локальная политика требуют явно заданного правила совместного применения. В упражнении оно приведено в условии. Рассчитайте расписание по готовой ленте событий: настоящий API не вызывается.
Это бесплатное упражнение из платного курса. Проверьте решение без регистрации. Объяснения и последовательная практика — в курсе «LLMOps & Evaluation: из песочницы в продакшн».
Задача: Backoff/Retry — расписание повторов с Retry-After и full-jitter
Цель. По «ленте» ответов мок-API построить детерминированное расписание ретраев и выдать сводку.
Формат ввода
- Строка 1: политика —
expoилиfull-jitter. - Строка 2: четыре значения через пробел —
basefactorcapseed.
base > 0, factor ≥ 1, cap ≥ base (в секундах). seed — целое; дляexpoигнорируется. - Строка 3: целое
M(1..1000) — число ответов в ленте. - Далее 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всегда неотрицателен; он «перебивает» меньший бэкофф.- Суммарную задержку считайте как сумму всех ожиданий между попытками.
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- PromptOps: почему хороший промпт требует версий и тестов
- LLM streaming: задержка первого токена и полный ответ
- JSON-лог вызовов LLM на Python: задача с проверкой
- Quality Gate для LLM: задача на допуск релиза
- Валидация JSON и retries на Python: задача Guardrails
- RAG с цитатами: что проверять автоматическим тестом
