En esta sección, aprenderemos sobre dos conceptos cruciales para la gestión y protección de APIs RESTful: Rate Limiting y Throttling. Estos mecanismos ayudan a controlar el tráfico hacia tu API, asegurando que los recursos no se sobrecarguen y que los usuarios tengan una experiencia consistente.

¿Qué es Rate Limiting?

Rate Limiting es una técnica utilizada para restringir el número de solicitudes que un cliente puede hacer a una API en un período de tiempo específico. Esto es esencial para:

  • Proteger los recursos del servidor: Evita que un solo cliente consuma todos los recursos disponibles.
  • Mejorar la calidad del servicio: Asegura que todos los usuarios tengan acceso equitativo a la API.
  • Prevenir abusos: Evita ataques de denegación de servicio (DoS) y otros comportamientos maliciosos.

Ejemplo de Rate Limiting

Imagina que tienes una API que permite a los usuarios consultar el clima. Podrías implementar un límite de 100 solicitudes por hora por usuario. Esto significa que cada usuario puede hacer hasta 100 solicitudes en una hora. Si un usuario intenta hacer más de 100 solicitudes, recibirá una respuesta de error.

{
  "error": "Rate limit exceeded",
  "message": "You have exceeded the rate limit of 100 requests per hour."
}

Implementación de Rate Limiting

A continuación, se muestra un ejemplo de cómo implementar Rate Limiting en una API utilizando Node.js y Express:

const express = require('express');
const rateLimit = require('express-rate-limit');

const app = express();

// Definir el límite de solicitudes
const limiter = rateLimit({
  windowMs: 60 * 60 * 1000, // 1 hora
  max: 100, // Limite de 100 solicitudes por IP
  message: {
    error: "Rate limit exceeded",
    message: "You have exceeded the rate limit of 100 requests per hour."
  }
});

// Aplicar el limitador a todas las solicitudes
app.use(limiter);

app.get('/weather', (req, res) => {
  res.send('Weather data');
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

¿Qué es Throttling?

Throttling es una técnica similar a Rate Limiting, pero en lugar de rechazar las solicitudes que exceden el límite, las ralentiza. Esto puede ser útil para:

  • Gestionar la carga del servidor: Distribuye las solicitudes en el tiempo para evitar picos de carga.
  • Mejorar la experiencia del usuario: En lugar de recibir un error, el usuario experimenta una respuesta más lenta.

Ejemplo de Throttling

Continuando con el ejemplo de la API del clima, podrías implementar un sistema que permita a los usuarios hacer hasta 5 solicitudes por segundo. Si un usuario intenta hacer más de 5 solicitudes en un segundo, las solicitudes adicionales se ralentizarán.

Implementación de Throttling

A continuación, se muestra un ejemplo de cómo implementar Throttling en una API utilizando Node.js y Express:

const express = require('express');
const slowDown = require('express-slow-down');

const app = express();

// Definir el limitador de velocidad
const speedLimiter = slowDown({
  windowMs: 1000, // 1 segundo
  delayAfter: 5, // Permitir 5 solicitudes por segundo
  delayMs: 500 // Ralentizar las solicitudes adicionales en 500ms
});

// Aplicar el limitador de velocidad a todas las solicitudes
app.use(speedLimiter);

app.get('/weather', (req, res) => {
  res.send('Weather data');
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

Comparación entre Rate Limiting y Throttling

Característica Rate Limiting Throttling
Propósito Limitar el número de solicitudes Ralentizar las solicitudes adicionales
Respuesta Error cuando se excede el límite Respuesta más lenta cuando se excede el límite
Uso común Prevenir abusos y proteger recursos Gestionar la carga del servidor
Implementación Rechazar solicitudes adicionales Ralentizar solicitudes adicionales

Ejercicio Práctico

Ejercicio 1: Implementar Rate Limiting

  1. Objetivo: Implementar Rate Limiting en una API que permite a los usuarios consultar información de productos.
  2. Requisitos:
    • Limitar a 50 solicitudes por hora por usuario.
    • Devolver un mensaje de error cuando se exceda el límite.

Solución

const express = require('express');
const rateLimit = require('express-rate-limit');

const app = express();

// Definir el límite de solicitudes
const limiter = rateLimit({
  windowMs: 60 * 60 * 1000, // 1 hora
  max: 50, // Limite de 50 solicitudes por IP
  message: {
    error: "Rate limit exceeded",
    message: "You have exceeded the rate limit of 50 requests per hour."
  }
});

// Aplicar el limitador a todas las solicitudes
app.use(limiter);

app.get('/products', (req, res) => {
  res.send('Product data');
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

Ejercicio 2: Implementar Throttling

  1. Objetivo: Implementar Throttling en una API que permite a los usuarios consultar información de usuarios.
  2. Requisitos:
    • Permitir hasta 10 solicitudes por segundo.
    • Ralentizar las solicitudes adicionales en 200ms.

Solución

const express = require('express');
const slowDown = require('express-slow-down');

const app = express();

// Definir el limitador de velocidad
const speedLimiter = slowDown({
  windowMs: 1000, // 1 segundo
  delayAfter: 10, // Permitir 10 solicitudes por segundo
  delayMs: 200 // Ralentizar las solicitudes adicionales en 200ms
});

// Aplicar el limitador de velocidad a todas las solicitudes
app.use(speedLimiter);

app.get('/users', (req, res) => {
  res.send('User data');
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

Conclusión

En esta sección, hemos aprendido sobre los conceptos de Rate Limiting y Throttling, sus diferencias y cómo implementarlos en una API utilizando Node.js y Express. Estos mecanismos son esenciales para proteger tus recursos y asegurar una experiencia de usuario consistente. Asegúrate de ajustar los límites y las políticas de acuerdo con las necesidades específicas de tu API y tus usuarios.

En la siguiente sección, exploraremos CORS y políticas de seguridad, donde aprenderemos cómo manejar la seguridad de las APIs RESTful en un entorno de producción.

© Copyright 2024. Todos los derechos reservados