Вопрос проверяет понимание стратегии повторных попыток с экспоненциальной задержкой для повышения отказоустойчивости клиент-серверного взаимодействия.
Экспоненциальный backoff — это алгоритм повторных попыток выполнения запроса, при котором интервал ожидания между попытками увеличивается по экспоненциальному закону. Это ключевой паттерн для построения отказоустойчивых систем, особенно при работе с нестабильными сетевыми сервисами или API с ограничением частоты запросов.
При получении ошибки (например, HTTP 429 Too Many Requests или 503 Service Unavailable) клиент не повторяет запрос сразу, а ждет определенное время. После каждой неудачной попытки время ожидания умножается на фиксированный коэффициент (обычно 2). Базовая формула: delay = baseDelay * (2 ^ attempt). Для предотвращения эффекта "грозы" (когда все клиенты одновременно повторяют запросы) добавляется случайное отклонение — jitter.
async function fetchWithExponentialBackoff(url, maxRetries = 5) {
const baseDelay = 1000; // 1 секунда
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
const response = await fetch(url);
if (response.ok) return response;
if (response.status === 429 || response.status >= 500) {
// Вычисляем задержку с jitter
const delay = baseDelay * Math.pow(2, attempt) + Math.random() * 1000;
await new Promise(resolve => setTimeout(resolve, delay));
} else {
throw new Error(`HTTP ${response.status}`);
}
} catch (error) {
if (attempt === maxRetries - 1) throw error;
}
}
}Экспоненциальный backoff — обязательный паттерн для любого клиента, взаимодействующего с внешними сервисами. Он повышает стабильность системы, снижает нагрузку на сервер и увеличивает вероятность успешного выполнения запроса при временных сбоях. Всегда добавляйте jitter и ограничение на максимальное количество попыток.