Из-за временных ограничений на территории РФ наблюдаются проблемы с оплатой. Если платёж не проходит, оставьте запрос в службу поддержки.Служба поддержки работает 24/7 — мы всегда на связи по вопросам хостинга и серверов.Открыт прием заявок на аренду выделенных серверов и размещение оборудования в дата-центре.Напоминаем: рекомендуем включить резервное копирование для дополнительной защиты данных.Доступна новая линейка VPS/VDS с NVMe-дисками и увеличенной производительностью.Технические работы на части серверов завершены. Все сервисы работают в штатном режиме.
Статья5 мин чтенияПросмотры0

Три попытки превратились в 27: как ограничить повторы запросов API

Повторы в модуле, библиотеке и промежуточном обработчике могут перемножаться. Считаем учебный пример и разбираем общий срок операции, задержки и условия повторной отправки.

Комментарии 0

Латунный звонок и его многочисленные отражения в зеркалах: один вызов порождает повторения
В этой статье

При сбое магазин делает до трёх попыток отправки запроса. Его библиотека тоже умеет повторять запросы. Между ними стоит ещё один обработчик с такой же настройкой. На схеме всё выглядит заботливо: каждый уровень пытается пережить временную ошибку. У нижнего сервиса эта забота превращается в дополнительную нагрузку именно тогда, когда ему уже трудно.

Начать стоит с инвентаризации повторов по всей цепочке: кто повторяет, какие ошибки считает временными, сколько попыток делает и сколько времени имеет вся операция. Одна настройка в модуле магазина не описывает поведение HTTP-клиента, очереди и внешнего SDK одновременно.

Откуда берутся 27 обращений

В учебной модели есть три вложенных уровня. На каждом разрешены три попытки всего: первоначальная и две повторные. Каждая попытка верхнего уровня запускает до трёх попыток среднего; каждая из них — до трёх попыток нижнего. Если все вызовы завершаются ошибкой и повторы полностью исчерпываются, получаем 3 × 3 × 3 = 27 обращений к нижнему сервису.

Это верхняя граница выбранной упрощённой модели, а не измерение магазина. При раннем успехе, общем сроке выполнения или иной политике ошибок число будет меньше. Локальный перебор трёх вложенных циклов подтвердил 27. Если повторы оставить только на одном уровне с тем же пределом, в этой модели обращений будет не более трёх.

Особенно легко ошибиться в словах «три повтора» и «три попытки». Первое обычно означает ещё три запроса после исходного, то есть четыре всего; второе может включать исходный. Название параметра нужно проверять в документации конкретной библиотеки. Например, документация AWS SDK определяет максимальное число попыток с учётом первого запроса; это не правило наименования всех остальных клиентов.

Лимит попыток и срок операции нужны одновременно

Пусть одна попытка может занять две секунды, а между тремя попытками предусмотрены ожидания одну и две секунды. В нашем последовательном примере получается 2 + 1 + 2 + 2 + 2 = 9 секунд без дополнительного времени на подготовку. Тайм-аут две секунды не означает, что пользователь получит окончательный ответ через две секунды.

Общий срок операции ограничивает всю цепочку ожидания. Перед следующей попыткой проверяют оставшееся время, а вложенному вызову передают допустимый остаток, если протокол и библиотека это поддерживают. Документация gRPC описывает распространение дедлайна между вызовами. Для произвольного HTTP-клиента такая возможность не возникает сама: её наличие и реализацию проверяют отдельно.

Истечение ожидания на стороне клиента не доказывает отмену работы на сервере. Поэтому у операции создания заказа по-прежнему остаётся вопрос неопределённого результата и защиты от дублей. Общий дедлайн ограничивает ожидание, но не заменяет ключ повторяемости и способ узнать фактический итог.

Задержка со случайным разбросом не заменяет бюджет

Если тысяча клиентов после сбоя ждёт ровно одну секунду, они могут вернуться почти одновременно. Увеличение задержек с добавлением случайного разброса помогает разнести повторные обращения. Такую практику описывают Google SRE и документация механизмов повторов AWS. Конкретные интервалы выбирают по условиям API и допустимому времени операции.

Однако случайность меняет распределение во времени, а не установленный максимум попыток. Двадцать семь разрешённых обращений не превращаются в три только потому, что паузы стали разными. Поэтому полезно отдельно ограничивать повторы одной операции и общий поток повторных обращений к зависимому сервису.

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

Повторять только то, что имеет шанс измениться

Неверный обязательный реквизит не исправится от ожидания. Отказ в доступе тоже требует выяснения причины, а не бесконечной отправки того же запроса. Временный сетевой сбой может допускать повтор, но для операции с побочным эффектом этого недостаточно: контракт должен позволять безопасно определить или повторить её результат.

Статус 429 означает ограничение частоты запросов. Ответ может содержать Retry-After; отсутствие этого заголовка не означает разрешение немедленно продолжать. Если поставщик сообщает время ожидания, его учитывают вместе с общим сроком операции. Когда ждать в текущем запросе уже нельзя, нужен предусмотренный процесс отложенной обработки или явный отказ, а не попытка обойти ограничение.

Правила ошибок берут из документации конкретного сервиса, включая его машинные коды. Не стоит автоматически приравнивать любой ответ одного HTTP-класса к одному сценарию повтора. Также не нужно менять ключ операции после каждого тайм-аута: это способ превратить неопределённый результат в несколько независимых команд.

Что измерить на приёмке

В безопасном тестовом контуре полезно смоделировать временный отказ, постоянную ошибку входных данных и медленный ответ. Для одной бизнес-операции посчитайте все фактические обращения, суммарное время и причину остановки. Отдельно проверьте, что истечение общего срока не запускает новую цепочку с полным бюджетом.

Результатом должна стать понятная граница: эта операция может обратиться к зависимости не более согласованного числа раз, ждать не дольше согласованного срока и повторяться только при перечисленных условиях. Приведённые числа учебные; реальный стек здесь не испытывался. Такая граница помогает пережить сбой, не поручая каждому слою самостоятельно его усилить.

Обсуждение 0

Делись опытом и задавай вопросы. Комментарии без ссылок появляются после проверки редактором.

Пока никто не написал. Начни обсуждение.