Вопрос проверяет умение проектировать промежуточный сервис для управления запросами к API с ограничениями по частоте, количеству вызовов или функциональности, что необходимо для обеспечения стабильности и эффективности интеграций.
Прокси-сервис для работы с ограниченным API — это промежуточный сервис (middleware), который размещается между клиентскими приложениями и целевым API, имеющим ограничения по частоте запросов (rate limits), общему количеству вызовов или функциональности. Основная задача такого прокси — управлять потоком запросов, чтобы не нарушить условия использования API, и одновременно повысить надёжность и производительность клиентской системы.
Рассмотрим простой прокси на Node.js с использованием Express, реализующий базовое ограничение частоты запросов и кэширование.
const express = require('express');
const axios = require('axios');
const rateLimit = require('express-rate-limit');
const NodeCache = require('node-cache');
const app = express();
const cache = new NodeCache({ stdTTL: 300 }); // Кэш на 5 минут
// Rate limiting для клиентов прокси
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 минут
max: 100, // максимум 100 запросов с одного IP
message: 'Too many requests from this IP'
});
app.use(limiter);
app.get('/proxy/api/users/:id', async (req, res) => {
const userId = req.params.id;
const cacheKey = `user_${userId}`;
// Проверка кэша
const cachedData = cache.get(cacheKey);
if (cachedData) {
return res.json({ source: 'cache', data: cachedData });
}
try {
// Запрос к целевому API
const response = await axios.get(`https://api.example.com/users/${userId}`, {
headers: { 'Authorization': `Bearer ${process.env.API_KEY}` }
});
// Сохранение в кэш
cache.set(cacheKey, response.data);
res.json({ source: 'api', data: response.data });
} catch (error) {
// Обработка ошибок (можно добавить Circuit Breaker)
if (error.response && error.response.status === 429) {
res.status(429).json({ error: 'Rate limit exceeded for target API' });
} else {
res.status(500).json({ error: 'Internal proxy error' });
}
}
});
app.listen(3000, () => console.log('Proxy server running on port 3000'));Такой подход используется в микросервисных архитектурах для управления вызовами внешних сервисов, в мобильных и веб-приложениях, интенсивно использующих сторонние API (например, социальные сети, платежные системы, картографические сервисы). Прокси позволяет централизованно контролировать политики доступа, обеспечивать отказоустойчивость и собирать метрики.
Вывод: Прокси-сервис для ограниченного API стоит применять, когда ваше приложение зависит от внешнего API с жёсткими лимитами или когда необходимо повысить надёжность, производительность и наблюдаемость интеграции. Это особенно полезно в высоконагруженных системах, где прямое обращение к API может привести к блокировке или нестабильной работе.