> Как спроектировать и реализовать rate limiting для платного API с разными тарифами (JavaScript)

Уровень: senior · Роль: frontend · Язык: JavaScript · Категория: Технические вопросы

Компании: QueenInteractiveGamesLtd

Стек: Node.js, JavaScript

> Пример ответа

Для проектирования rate limiting платного API с разными тарифами на Node.js я бы использовал комбинацию стратегий: Token Bucket (для гибкости) и Sliding Window (для точности). Основные шаги:

  1. Архитектура хранения - Redis (быстрый, атомарные операции). Ключи: rate_limit:{userId}:{tariff}:{timestamp_window}.

  2. Структура тарифов - хранить в конфиге или БД:

JAVASCRIPT
const tariffs = {
free: { requests: 100, windowMs: 3600000 }, // 100/час
pro: { requests: 10000, windowMs: 3600000 },
enterprise: { requests: 100000, windowMs: 3600000 }
};
  1. Middleware для Express:
JAVASCRIPT
const rateLimit = (req, res, next) => {
const userId = req.user.id; // из JWT
const tariff = req.user.tariff || 'free';
const { requests, windowMs } = tariffs[tariff];
const key = `rl:${userId}:${tariff}`;
// Используем MULTI для атомарности
const now = Date.now();
redis.multi()
.zremrangebyscore(key, 0, now - windowMs) // удаляем старые
.zadd(key, now, `${now}-${Math.random()}`) // добавляем запрос
.zcard(key) // считаем
.expire(key, Math.ceil(windowMs / 1000))
.exec((err, results) => {
const count = results[2][1];
if (count > requests) {
return res.status(429).json({
error: 'Too Many Requests',
retryAfter: Math.ceil((windowMs - (now - oldestTimestamp)) / 1000)
});
}
next();
});
};
  1. Ключевые моменты:
  • Используем sorted sets в Redis для скользящего окна.

  • Добавляем случайный суффикс к timestamp, чтобы избежать коллизий.

  • Для enterprise-тарифов можно увеличить лимиты и добавить burst-возможности (например, 1000 запросов за 1 секунду).

  • Мониторинг: логируем превышения лимитов и отправляем метрики в Prometheus.

  1. Масштабирование: при нескольких инстансах Redis обеспечивает консистентность. Для критичных API добавляем rate limiting на уровне Nginx (как первый барьер) и на уровне приложения (для точного биллинга).

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью