Вопрос проверяет понимание стратегий для работы с API, имеющими лимиты на количество запросов, что необходимо для создания надежных и отказоустойчивых приложений.
Когда внешний API накладывает ограничения на количество запросов в единицу времени (rate limiting), прямое выполнение всех операций может привести к ошибкам 429 и блокировке. Для организации надежной обработки требуется стратегический подход, который учитывает лимиты, обрабатывает ошибки и оптимизирует производительность.
Рассмотрим простой пример с очередью и экспоненциальной отсрочкой с использованием библиотеки p-queue для управления параллелизмом.
const PQueue = require('p-queue');
const axios = require('axios');
// Создаем очередь с интервалом между задачами
const queue = new PQueue({
intervalCap: 10, // макс 10 запросов
interval: 1000, // за 1 секунду
carryoverConcurrencyCount: true
});
async function makeAPICall(url, retries = 3) {
let delay = 1000; // Начальная задержка 1с
for (let i = 0; i < retries; i++) {
try {
const response = await axios.get(url);
// Проверяем заголовки лимита, если есть
console.log('Remaining:', response.headers['x-ratelimit-remaining']);
return response.data;
} catch (error) {
if (error.response && error.response.status === 429 && i < retries - 1) {
// Экспоненциальная отсрочка при ошибке 429
await new Promise(resolve => setTimeout(resolve, delay));
delay *= 2; // Удваиваем задержку
console.log(`Retry ${i+1} after ${delay}ms`);
} else {
throw error; // Другие ошибки или исчерпаны попытки
}
}
}
}
// Добавляем задачи в очередь
queue.add(() => makeAPICall('https://api.example.com/data/1'));
queue.add(() => makeAPICall('https://api.example.com/data/2'));
// ...В этом примере очередь гарантирует, что не более 10 запросов в секунду уйдут к API. Функция makeAPICall реализует логику повторных попыток с экспоненциальной отсрочкой для ошибок 429.
Данные подходы критически важны в интеграциях с популярными публичными API (Twitter, GitHub, Stripe), в микросервисных архитектурах для предотвращения каскадных сбоев, а также в любых системах, где ресурс ограничен и требуется регулировка нагрузки.
Вывод: Используйте комбинацию очереди, экспоненциальной отсрочки и кэширования для создания устойчивого клиента API, который уважает ограничения провайдера, минимизирует ошибки и эффективно использует доступные ресурсы.