Пользователь ждет ответ, а несколько слоев системы повторяют один и тот же неудачный вызов. Общая задержка растет, зависимость получает дополнительную нагрузку, и отмена клиента не останавливает работу. Таймауты нужно проектировать как общий бюджет, а повторы — как ограниченную стратегию для определенных ошибок.
Что подготовить
- Цепочка синхронных вызовов и максимальное полезное время ответа для клиента.
- Таймауты соединения и операции, число попыток и задержки на каждом уровне.
- Классификация ошибок и сведения о повторяемости побочных эффектов.
Порядок работы
- Нарисуйте цепочку вызовов и сложите худшие допустимые времена с учетом повторов. Сравните сумму с внешним сроком запроса.
- Передавайте оставшийся срок вниз, если архитектура это допускает. Оставьте время на возврат ошибки и освобождение ресурсов.
- Назначьте ответственность за повторы одному согласованному уровню. Повторяйте только временные ошибки безопасно повторяемых операций.
- Ограничьте число попыток, добавьте увеличивающуюся задержку и разброс, чтобы клиенты не повторяли одновременно.
- Проверьте отмену, медленный ответ, обрыв соединения после применения операции и длительную недоступность зависимости.
Разобранный пример
У внешнего запроса бюджет три секунды. Два внутренних вызова по две секунды с одним повтором уже не помещаются в него. План выделяет первому этапу ограниченный срок, передает остаток второму и запрещает попытку, которая заведомо не успеет завершиться полезно.
Как проверить результат
- Запрос прекращает полезную работу после отмены или исчерпания общего срока.
- Максимальное количество обращений к зависимости известно и ограничено.
- Повтор не создает второго побочного эффекта при неоднозначном первом результате.
Если что-то пошло не так
При росте нагрузки сначала ограничьте повторы и параллелизм, сохраняя понятный отказ. Не увеличивайте все таймауты одновременно: это может удерживать ресурсы дольше и расширять очередь. Для неидемпотентного вызова требуется отдельное согласование результата.
Таблица временного бюджета
Для каждого вызова заведите строку: кто вызывает, сколько осталось времени, сколько разрешено попыток, какие ошибки повторяются и есть ли побочный эффект. Включайте ожидание соединения и задержки между попытками. Если эти интервалы забыты, формально короткие операции могут вместе выйти за внешний срок. Финальная колонка должна показывать действие при исчерпании бюджета.
Рассмотрите три разных отказа. Соединение не установилось: запрос мог не попасть к исполнителю. Ответ не пришел после отправки: результат может быть неизвестен. Получен определенный отказ приложения: повтор зависит от смысла отказа. Эти ситуации нельзя объединять правилом «повторить при любом исключении». Для неоднозначной записи сначала выясняют состояние по идентификатору операции.
Проверьте также очередь перед началом обработки. Запрос, потративший почти весь бюджет в очереди, не должен начинать дорогое действие без оставшегося времени на полезный результат. В журнале сохраняйте причину завершения и число попыток, чтобы отличать внутренний таймаут от отмены пользователя. При сравнении конфигураций смотрите одновременно задержку, число обращений и долю завершенных операций: уменьшение ошибок ценой бесконечного ожидания не является полноценным улучшением.
Промпт для разбора ваших материалов
По цепочке сервисов рассчитай максимальное время и число попыток. Предложи согласованные бюджеты и правила повторов по классам ошибок. Отдельно опиши отмену и неоднозначный результат операции с побочным эффектом.Частые вопросы
Нужно ли повторять любую серверную ошибку?
Нет. Некоторые ошибки постоянны или означают некорректный запрос. Повторы должны опираться на контракт и наблюдаемую причину.
Зачем случайный разброс задержки?
Он уменьшает синхронные волны повторов большого числа клиентов после общего сбоя.
Материал библиотеки решений Ильи Тарасова / TarasovWeb.
О проекте
Практическая библиотека Ильи Тарасова и TarasovWeb. Telegram-канал · Личная страница · ВКонтакте.
#tarasovweb #ИльяТарасов
