Skip to content

Limitación de tasa y control de backpressure

Prólogo

El Double Eleven a medianoche, cientos de millones de usuarios accediendo simultáneamente -- ¿pueden los servidores soportarlo? Todo sistema tiene un límite de capacidad de procesamiento. Cuando el volumen de solicitudes supera la capacidad de carga del sistema, sin control, el resultado es que nadie puede usarlo. La limitación de tasa y el backpressure son las dos líneas de defensa que protegen al sistema de ser "aplastado".

¿Qué aprenderás en este artículo?

Después de completar este capítulo, habrás adquirido:

  • Necesidad de la limitación de tasa: comprender por qué es necesario rechazar activamente algunas solicitudes para proteger el sistema
  • Algoritmos de limitación: dominar los principios y diferencias de los tres algoritmos centrales: cubo de tokens, cubo con fugas y ventana deslizante
  • Mecanismo de backpressure: comprender las estrategias de procesamiento cuando la velocidad aguas arriba supera a la aguas abajo
  • Limitación multicapa: conocer la arquitectura de limitación multicapa desde el cliente hasta la pasarela y el servicio
  • Capacidad práctica: saber qué estrategia de limitación elegir en cada escenario
CapítuloContenidoConcepto central
Cap. 1Por qué se necesita la limitaciónEfecto avalancha, protección de servicios
Cap. 2Algoritmos de limitaciónCubo de tokens, cubo con fugas, ventana deslizante
Cap. 3Control de backpressureBuffer, estrategia de descarte, escalado elástico
Cap. 4Arquitectura de limitación multicapaCliente, pasarela, servidor
Cap. 5Práctica y selecciónNginx, Redis, Sentinel

0. Panorama: ¿Por qué "rechazar" usuarios?

Parece contradictorio -- ¿no deberíamos servir bien a cada usuario? Pero la realidad es: si no se rechazan algunas solicitudes, todas las solicitudes fallarán.

Imagina un restaurante para 100 personas donde de repente entran 1000. Sin limitación, el resultado no es que las 1000 personas puedan comer, sino que la cocina colapsa y los camareros se paralizan, nadie puede comer. La solución correcta es hacer cola y limitar en la entrada, dejando entrar a 100 personas primero, mientras las demás esperan.

Objetivo central de la limitación

  • Proteger el sistema: evitar que la sobrecarga cause la indisponibilidad total del servicio
  • Asignación justa: garantizar que las solicitudes aceptadas se procesen normalmente
  • Degradación elegante: las solicitudes limitadas reciben un código de estado 429 claro, en lugar de un timeout o error 500

1. Algoritmos de limitación: tres soluciones clásicas

El problema central de la limitación es: ¿cuántas solicitudes se permiten pasar como máximo en una unidad de tiempo? Los diferentes algoritmos tienen diferentes compensaciones en precisión, manejo de tráfico burst y complejidad de implementación.

Rate Limiting Algorithm Comparison
Choose an algorithm, then send requests to observe the effect
Passed0
Rejected0
Tokens left5
Token bucket
Adds tokens to the bucket at a fixed rate. Each request consumes one token, and extra tokens are discarded when the bucket is full. It allows bursts when stored tokens are available.
AlgoritmoPrincipioTráfico burstPrecisiónComplejidad
Cubo de tokensTasa fija de emisión de tokens, las solicitudes consumen tokensPermitido (si hay tokens en el cubo)AltaMedia
Cubo con fugasLas solicitudes se encolan, procesamiento a tasa fijaNo permitido (completamente suavizado)AltaMedia
Ventana deslizanteCuenta solicitudes dentro de la ventanaParcialmente permitidoBastante altaBaja
Ventana fijaCuenta por ventana de tiempoPuede haber burst en los bordesBajaLa más baja

¿Qué algoritmo elegir?

  • Limitación de API: el cubo de tokens es el más usado, permite tráfico burst razonable
  • Modelado de tráfico: el cubo con fugas es adecuado para escenarios que requieren tasa de salida constante
  • Conteo simple: la ventana deslizante es fácil de implementar, adecuada para la mayoría de aplicaciones web

2. Control de backpressure: cuando aguas arriba es más rápido que aguas abajo

La limitación resuelve el problema de "demasiadas solicitudes externas", mientras que backpressure resuelve el problema de "velocidad inadecuada entre componentes internos".

Cuando el productor genera datos más rápido de lo que el consumidor puede procesarlos, el buffer intermedio se expande continuamente, eventualmente causando desbordamiento de memoria o pérdida de datos. El mecanismo de backpressure permite al consumidor "notificar en reversa" al productor para que reduzca la velocidad.

Backpressure Control
What happens when production is faster than consumption?
Produce rate:6/s
Consume rate:3/s
Producer
6/s
Buffer (0/20)
Running normally
Consumer
3/s
Backpressure strategies:
Drop strategy
Drop new data directly when the buffer is full
Example: log collection, real-time metrics
Blocking strategy
Make producers wait when the buffer is full
Example: Go channels, Java BlockingQueue
Sampling strategy
Process only part of the data and skip the rest
Example: downsampling high-frequency sensor data
Elastic scaling
Dynamically increase the number of consumers
Example: Kubernetes HPA autoscaling

Cuatro estrategias de backpressure

  1. Descartar (Drop): cuando el buffer está lleno, descartar datos nuevos o antiguos, adecuado para escenarios de alta demanda de tiempo real pero que toleran pérdida
  2. Bloquear (Block): pausar el productor, esperar a que el consumidor termine antes de continuar, adecuado para escenarios donde los datos no pueden perderse
  3. Muestrear (Sample): procesar solo algunos datos, adecuado para flujos de datos de alta frecuencia
  4. Escalado elástico (Scale): aumentar dinámicamente el número de consumidores, adecuado para entornos cloud-native

3. Arquitectura de limitación multicapa

En entornos de producción, la limitación no es suficiente en un solo punto, sino que se necesita protección multicapa, donde cada capa resuelve problemas de diferente granularidad.

CapaUbicaciónGranularidadHerramienta
ClienteFrontend/AppAnti-rebote de botones, throttle de solicitudeslodash.throttle, debounce
CDN/WAFNodo edgeNivel de IP, nivel geográficoCloudflare Rate Limiting
API GatewayPasarela de entradaNivel de ruta, nivel de usuarioNginx limit_req, Kong
ServidorDentro de la aplicaciónNivel de endpoint, nivel de recursoSentinel, Resilience4j
Base de datosCapa de almacenamientoConexiones, QPSConfiguración de pool de conexiones, fusión de consultas lentas

Especificación HTTP para limitación

Las solicitudes limitadas deben devolver el código de estado 429 Too Many Requests, e incluir en los headers de respuesta:

  • Retry-After: cuánto tiempo esperar antes de reintentar (segundos o fecha)
  • X-RateLimit-Limit: límite de tasa
  • X-RateLimit-Remaining: cuota restante
  • X-RateLimit-Reset: hora de restablecimiento de cuota

4. Selección práctica

EscenarioSolución recomendadaDescripción
Limitación de entrada Nginxlimit_req_zoneBasado en cubo con fugas, configuración simple
Limitación distribuidaRedis + script LuaCubo de tokens o ventana deslizante, conteo compartido entre instancias
Microservicios JavaSentinel / Resilience4jSoporta fusión, degradación, limitación de puntos calientes
API Node.jsexpress-rate-limitSimple de usar, soporta almacenamiento Redis
Servicio Gogolang.org/x/time/rateImplementación de cubo de tokens de la biblioteca estándar

Resumen

La limitación de tasa y el backpressure son dos líneas de defensa clave para proteger la estabilidad del sistema. La limitación controla la velocidad de entrada del tráfico externo, el backpressure coordina la velocidad de procesamiento de los componentes internos.

Repaso de los puntos clave del capítulo:

  1. Necesidad de la limitación: si no se rechazan algunas solicitudes, todas fallarán
  2. Tres algoritmos centrales: cubo de tokens (permite burst), cubo con fugas (completamente suavizado), ventana deslizante (simple y preciso)
  3. Mecanismo de backpressure: descartar, bloquear, muestrear, escalar -- cuatro estrategias
  4. Protección multicapa: desde el cliente hasta la base de datos, cada capa resuelve problemas de diferente granularidad
  5. Especificación 429: devolver código de estado estándar e headers de limitación cuando se limita

Lecturas adicionales