Ретрай с задержкой (retry with delay) — паттерн надёжности на слое вызова: повтор того же запроса после временного сбоя, с паузой и джиттером, без смены контура.
На каком слое надёжности работает «Ретрай с задержкой»
Вызов: повтор того же запроса после временного сбоя.
Какой отказ моделирует паттерн «Ретрай с задержкой»
кратковременная недоступность: потеря пакета, перегруз на секунды, рестарт зависимости. Цель после паузы, скорее всего, снова жива.
Что изолирует «Ретрай с задержкой» и где кончается радиус взрыва
радиус одного вызова. Не изолирует арендаторов и не переключает контур. Ошибка, которая не временная (4xx прикладной, порча данных), не должна ретраиться.
Когда паттерн «Ретрай с задержкой» применять нельзя
если цель мертва — снимайте её и смотрите Резервирование. Если повтор без джиттера и лимита — усиливаете каскад. Нельзя ретраить неидемпотентную операцию без ключа идемпотентности.
Что записать в архитектурное решение (ADR) про «Ретрай с задержкой»
какие коды/условия временные, сколько попыток, закон паузы, бюджет времени, идемпотентность.
Оценка качеств «Ретрай с задержкой»: масштабируемость, надёжность, сопровождение
Звёзды — ориентир автора сайта, не бенчмарк и не сравнение продуктов.
- масштабируемость: ⭐⭐⭐ (3/5)
- надежность: ⭐⭐⭐⭐⭐ (5/5)
- сопровождение: ⭐⭐⭐⭐⭐ (5/5)
Варианты протокола «Ретрай с задержкой» и как выбрать
- Фиксированная пауза: просто, легко совпасть всем клиентам в один удар.
- Экспоненциальная пауза с джиттером: размазывает повтор, это и есть «retry with delay», а не «retry сразу три раза».
- Ретрай на краю (шлюз) vs в приложении: два слоя ретрая без общего бюджета = шторм.
Схема взаимодействия: как работает «Ретрай с задержкой»
sequenceDiagram
participant Клиент
participant Сервис
Клиент->>Сервис: запрос
Сервис--xКлиент: временный сбой
Note over Клиент: пауза с ростом и джиттером
Клиент->>Сервис: повтор
Сервис-->>Клиент: успехпопытка = 0
пока попытка < лимит:
ответ = вызвать(зависимость)
если временный(ответ):
ждать(пауза_с_джитом(попытка))
попытка += 1
иначе:
вернуть ответ
Типичные ошибки при внедрении «Ретрай с задержкой»
- Повтор без джиттера и без потолка — ретрай-шторм по уже больному сервису.
- Ретрай на клиенте и на шлюзе независимо, бюджет времени никто не считает.
- Повтор POST без ключа идемпотентности.
С какими паттернами не путать «Ретрай с задержкой»
- Резервирование — другой контур после смерти цели, не третий удар в тот же труп.
- Bulkhead — лимит одновременных вызовов; retry без bulkhead легко исчерпает общий пул.
- Сага (SAGA) — компенсация шага процесса, не пауза HTTP.
Источники для сверки формулировок про «Ретрай с задержкой»
В практике отказоустойчивости облака retry policy к API провайдера — отдельная рекомендация рядом с health check, не замена вывода мёртвой цели. Yandex Cloud — рекомендации по отказоустойчивости.
Частые вопросы про «Ретрай с задержкой (Retry with delay)»
Когда retry with delay применять нельзя?
Если цель мертва — её снимают и смотрят failover. Нельзя ретраить неидемпотентный запрос без ключа и без лимита попыток: получите шторм.
Зачем джиттер в повторных попытках?
Фиксированная пауза синхронизирует клиентов. Экспоненциальная пауза с джиттером размазывает повтор по времени.
Чем retry отличается от саги?
Retry — пауза одного вызова. Сага — компенсации бизнес-шагов на нескольких сервисах.