Таймауты, retry с backoff и jitter
↑ 7.3 Надёжность и отказоустойчивость · → Следующая
Зачем это на собесе
Основа устойчивых вызовов: без таймаута и разумных ретраев сбой одного сервиса каскадно роняет остальные.
Объяснение
Таймаут — верхняя граница ожидания. Без неё вызов может висеть вечно и занимать ресурсы (поток, соединение, память).
Уровни таймаутов: соединение (connect), одна попытка, общий бюджет операции (deadline). Внутренние таймауты должны быть меньше внешних: сумма попыток укладывается в общий срок.
Retry повторяет неуспешную попытку. Правила:
| Правило | Пояснение |
|---|---|
| Только временные ошибки | 5xx, таймаут, сетевые сбои, 429; не 400/404 |
| Только идемпотентные операции | или с ключом идемпотентности |
| Ограниченное число попыток | обычно 3–5 |
| Экспоненциальная задержка | 100 мс, 200, 400, 800… |
| Jitter (случайный разброс) | чтобы клиенты не повторяли синхронно (thundering herd) |
Учитывать Retry-After | сервер сам задаёт паузу при 429/503 |
| Бюджет ретраев | ограничение доли повторов, чтобы не утроить нагрузку на проблемный сервис |
var delay = TimeSpan.FromMilliseconds(Math.Min(cap, baseMs * Math.Pow(2, attempt)));
delay += TimeSpan.FromMilliseconds(Random.Shared.NextDouble() * delay.TotalMilliseconds); // full jitterУсиление ретраев: 3 слоя по 3 попытки = 27 запросов на один исходный. Ретраи делайте на одном слое (обычно ближе к вызывающему).
Нюансы и подводные камни
- Ретрай неидемпотентного POST без ключа — двойные списания.
- Таймаут клиента не отменяет работу на сервере: сервер тоже должен реагировать на отмену.
- Бесконечные ретраи превращают сбой в DoS собственной системы.
- Ретраи при перегрузке усугубляют её: сочетайте с circuit breaker и rate limiting.
- Логируйте попытки и итог, метрики числа ретраев.
Практика
- Настройте таймауты и retry с jitter для клиента внешнего API.
- Сымитируйте сбой и проследите число запросов на серверной стороне.
- Рассчитайте общий бюджет времени при 3 попытках по 2 секунды.
Вопросы с ответами
Зачем jitter?
Разводит повторы во времени, предотвращая синхронные всплески нагрузки.
Что можно ретраить?
Идемпотентные операции при временных ошибках.
Что такое усиление ретраев?
Ретраи на нескольких уровнях перемножаются и создают лавину запросов.