Вопрос проверяет знание методов контроля частоты запросов к внешним API для предотвращения перегрузки сервисов и соблюдения лимитов.
Rate limiting (ограничение частоты запросов) — это механизм, который контролирует, как часто клиентское приложение может отправлять запросы к внешнему API. Он необходим, чтобы не превысить квоты, установленные провайдером API, избежать блокировки IP или токена, а также снизить нагрузку на собственное приложение при обработке ошибок.
const Bottleneck = require('bottleneck');
const axios = require('axios');
// Создаём ограничитель: максимум 10 запросов в секунду
const limiter = new Bottleneck({
minTime: 100 // 100 мс между запросами (10 в секунду)
});
// Обёртка для запроса через ограничитель
const limitedGet = limiter.wrap(async (url) => {
try {
const response = await axios.get(url);
return response.data;
} catch (error) {
// Обработка ошибки 429 (Too Many Requests)
if (error.response && error.response.status === 429) {
console.log('Превышен лимит, повтор через 2 секунды...');
await new Promise(resolve => setTimeout(resolve, 2000));
return limitedGet(url); // Рекурсивный повтор
}
throw error;
}
});
// Использование
(async () => {
const data = await limitedGet('https://api.example.com/data');
console.log(data);
})();В этом примере библиотека Bottleneck гарантирует, что запросы будут отправляться с интервалом не менее 100 мс. Также добавлена базовая обработка ошибки 429 с повторной попыткой после задержки.
Rate limiting следует применять всегда, когда ваше приложение зависит от внешнего API с чёткими лимитами. Это критически важно для скриптов массовой обработки данных, фоновых джобов и микросервисов, которые агрегируют информацию из нескольких источников. Подход с очередью хорошо работает в асинхронных сценариях, например, при использовании брокеров сообщений (RabbitMQ, Kafka).
Вывод: Rate limiting — обязательная практика для надёжной интеграции с внешними API. Используйте готовые библиотеки для вашего стека технологий, чтобы избежать "велосипедов" и обеспечить стабильную работу приложения под нагрузкой.
Уровень
Рейтинг:
4
Сложность:
5
Навыки
Node.js
Networks
Ключевые слова
Подпишись на Python Developer в телеграм