Что такое ограничитель скорости API?

Механизм, используемый для управления скоростью входящих запросов или операций для предотвращения перегрузки и защиты сервера от чрезмерного трафика.

Он устанавливает ограничения на количество запросов, которые могут быть сделаны в течение определенного периода времени, обычно в секунду, минуту или час. Используется в API, веб-серверах и распределенных системах для обеспечения добросовестного использования, поддержания стабильности системы и защиты от злоупотреблений или DoS-атак (отказ в обслуживании).

        +--------------+
        |              | 
        |   Incoming   |
        |   Requests   |
        +--------------+
                |
                v
        +--------------+             +-----------------+
        |              |   Exceed    |                 |
        |              | Threshold   |                 |
        |   Rate       |    -- >     |    Deny Request |      
        |   Checking   |             |                 |
        +--------------+             +-----------------+
                |  Within threshold
                v         
        +---------------+
        |               |
        |Process Request|
        +---------------+

Ограничитель скорости работает, отслеживая количество запросов, сделанных клиентом, и сравнивая его с ограничением скорости. Если клиент превышает лимит, ограничитель скорости может реагировать по-разному, например возвращать сообщение об ошибке, откладывать запрос или временно блокировать дальнейшие запросы.

Реализация базового ограничителя скорости в Node.js

В этом примере мы будем использовать фреймворк «express» для создания API и пакет «node-rate-limiter-flexible» для ограничения скорости.

npm install express node-rate-limiter-flexible

Создайте функцию промежуточного программного обеспечения, которая будет отвечать за ограничение скорости запросов API.

const rateLimiter = require('node-rate-limiter-flexible').RateLimiterMemory;

// Configure the rate limiter
const limiter = new rateLimiter({
points: 10, // Maximum number of points (requests) allowed within the duration
duration: 1, // Duration in seconds
});


// Create the rate limiter middleware function
const rateLimiterMiddleware = (req, res, next) => {
limiter.consume(req.ip) // Track requests based on IP address
.then(() => {
next(); // Request within the rate limit, proceed to the next middleware
})
.catch(() => {
res.status(429).send('Too Many Requests'); // Request exceeded the rate limit
});
};

// Set the rate limit to 10 requests per second for each IP address.

Примените промежуточное ПО ограничителя скорости к маршрутам API.

const express = require('express');
const app = express();

// Apply the rate limiter middleware to all API routes
app.use(rateLimiterMiddleware);

// Define your API routes
app.get('/api/resource', (req, res) => {
res.send('API response');
});

// Start the server
app.listen(3000, () => {
console.log('Server started on port 3000');
});