Parte de nuestra serie Performance & Scalability
Leer la guía completaRendimiento de API: limitación de velocidad, paginación y procesamiento asíncrono
Su API es tan rápida como su punto final más lento bajo carga máxima. Un único punto final no optimizado que mantiene conexiones de base de datos durante 5 segundos puede agotar su grupo de conexiones y generar fallas en cascada en toda su plataforma. La ingeniería de rendimiento de API se centra en tres pilares: proteger su API de sobrecargas (limitación de velocidad), manejar grandes conjuntos de datos de manera eficiente (paginación) y sacar operaciones costosas del ciclo de solicitudes (procesamiento asíncrono).
Conclusiones clave
- El depósito de tokens y la ventana deslizante son los dos algoritmos de limitación de velocidad que cubren el 95 % de los casos de uso. Elija según si desea tolerancia a ráfagas o aplicación estricta.
- La paginación basada en cursor supera a la paginación desplazada para conjuntos de datos grandes porque evita contar las filas omitidas
- El procesamiento asíncrono con colas de trabajos reduce los tiempos de respuesta de P95 al mover el envío de correo electrónico, la generación de PDF y la entrega de webhooks fuera de la ruta de solicitud.
- La compresión de respuesta con Brotli reduce el tamaño de la carga útil entre un 70% y un 85%, lo que se traduce directamente en una representación más rápida del lado del cliente.
Algoritmos de limitación de velocidad
La limitación de velocidad protege su API contra abusos, garantiza una asignación justa de recursos y evita fallas en cascada durante picos de tráfico. El algoritmo que elija determina cómo se manejan las ráfagas y qué tan predecible es el comportamiento limitante para los consumidores.
| Algoritmo | Manejo de ráfagas | Uso de la memoria | Precisión | Mejor para |
|---|---|---|---|---|
| Ventana fija | Permite ráfagas 2x en el límite de la ventana | Muy bajo | Bajo | Casos de uso simples, API internas |
| Registro de ventana corredera | Sin ráfagas, preciso | Alto (almacena marcas de tiempo) | Muy alto | API financieras, estricto cumplimiento |
| Mostrador de ventana corredera | Explosión de límites mínima | Bajo | Alto | API públicas de uso general |
| Cubo de fichas | Permite ráfagas controladas | Bajo | Moderado | API con patrones de ráfaga naturales |
| Balde con fugas | Suaviza todo el tráfico | Bajo | Alto | API que requieren un rendimiento constante |
Cubo de fichas
El algoritmo de depósito de tokens es la opción más práctica para la mayoría de las API. Un cubo contiene fichas hasta una capacidad máxima. Los tokens se agregan a una tasa fija (la tasa de recarga). Cada solicitud consume un token. Si el depósito está vacío, la solicitud se rechaza o se pone en cola.
La ventaja clave del depósito de tokens es la tolerancia al estallido. Si un cliente no ha realizado solicitudes durante un tiempo, su depósito está lleno y puede realizar una ráfaga de solicitudes hasta la capacidad del depósito. Esto coincide con los patrones de uso naturales: un cliente que carga un panel puede realizar 20 solicitudes en rápida sucesión y luego nada durante 30 segundos.
Ejemplo de configuración para una API de comercio electrónico:
- Tamaño del cubo: 100 fichas
- Tasa de recarga: 10 tokens por segundo
- Esto permite ráfagas de hasta 100 solicitudes y al mismo tiempo mantiene 10 solicitudes por segundo a largo plazo.
Mostrador de ventana corrediza
El mostrador de ventana corrediza combina la precisión del registro de ventana corrediza con la eficiencia de memoria de la ventana fija. Mantiene contadores para la ventana actual y anterior, luego calcula un recuento ponderado en función de qué tan lejos de la ventana actual cae la solicitud.
Para una ventana de 60 segundos evaluada en 45 segundos, el recuento efectivo es: (recuento de ventanas anteriores * 0,25) + (recuento de ventanas actuales). Esto elimina el problema de la explosión de límites de las ventanas fijas sin almacenar marcas de tiempo de solicitudes individuales.
Implementación con Redis
Redis es el almacén de respaldo estándar para la limitación de velocidad distribuida porque proporciona operaciones de incremento atómico con TTL. Utilice INCR con EXPIRE para ventanas fijas o conjuntos ordenados con ZADD y ZRANGEBYSCORE para ventanas correderas. Para el depósito de tokens, los scripts de Redis Lua proporcionan operaciones atómicas de verificación y disminución.
Encabezados de limitación de velocidad comunican los límites a los consumidores de API:
X-RateLimit-Limit-- solicitudes máximas permitidas en la ventanaX-RateLimit-Remaining-- solicitudes restantes en la ventana actualX-RateLimit-Reset-- Marca de tiempo de Unix cuando se reinicia la ventanaRetry-After- segundos hasta que el cliente debería volver a intentarlo (en 429 respuestas)
Estrategias de paginación
Cada punto final de la lista debe estar paginado. Devolver conjuntos de resultados ilimitados desperdicia ancho de banda, sobrecarga la base de datos y corre el riesgo de errores de tiempo de espera a medida que crecen los datos.
Paginación compensada
La paginación compensada utiliza cláusulas SQL LIMIT y OFFSET. El cliente solicita ?page=3&limit=20 y el servidor traduce a OFFSET 40 LIMIT 20.
Ventajas:
- Fácil de implementar y comprender.
- Los clientes pueden saltar a cualquier página directamente
- El recuento total habilita la interfaz de usuario "Página X de Y"
Desventajas:
- El rendimiento se degrada con compensaciones altas:
OFFSET 1000000aún escanea 1.000.000 de filas antes de devolver resultados - Resultados inconsistentes cuando los datos cambian entre páginas (las filas cambian a medida que se insertan o eliminan nuevos datos)
- La consulta de recuento total (COUNT(*)) puede resultar costosa en tablas grandes
Paginación basada en cursor
La paginación basada en cursor utiliza un cursor opaco (normalmente una clave primaria codificada o una marca de tiempo) para marcar la posición en el conjunto de resultados. El cliente solicita ?cursor=abc123&limit=20 y el servidor usa el cursor como cláusula WHERE: WHERE id > decoded(abc123) LIMIT 20.
Ventajas:
- Rendimiento constante independientemente de la posición en el conjunto de datos: sin escaneo desplazado
- Resultados estables incluso cuando los datos cambian entre páginas
- Ajuste natural para desplazamiento infinito y transmisiones en tiempo real
Desventajas:
- No se puede saltar a páginas arbitrarias (no "Ir a la página 50")
- Más complejo de implementar, especialmente con órdenes de clasificación de varias columnas.
- El recuento total debe proporcionarse por separado si es necesario
Qué paginación utilizar
| Escenario | Recomendación | Razón |
|---|---|---|
| Tablas de datos administrativos con números de página | Compensación | Los usuarios esperan navegación en la página |
| Desplazamiento infinito móvil | Cursores | Rendimiento a cualquier profundidad |
| API consumida por integraciones | Cursores | Paginación estable para procesamiento por lotes |
| Conjuntos de datos pequeños (menos de 10.000 filas) | Cualquiera | La diferencia de rendimiento es insignificante |
| Grandes conjuntos de datos (más de 100.000 filas) | Cursores | La compensación se vuelve inutilizable lenta |
| Feeds en tiempo real (chat, notificaciones) | Cursores | Coherencia a medida que llegan nuevos datos |
Formato de respuesta de paginación
Una respuesta de paginación bien diseñada incluye metadatos que los clientes necesitan para navegar:
{
"data": [],
"pagination": {
"total": 15432,
"limit": 20,
"hasMore": true,
"nextCursor": "eyJpZCI6MTAwfQ=="
}
}
Procesamiento asíncrono con colas de trabajos
Los puntos finales de API síncronos deben devolver respuestas dentro de los 200 ms. Cualquier operación que demore más tiempo (enviar correos electrónicos, generar archivos PDF, procesar imágenes, llamar a API externas, ejecutar informes) debe trasladarse a una cola de trabajos en segundo plano.
El patrón de cola de trabajos
- El punto final API valida la solicitud y crea un registro de trabajo.
- El trabajo se coloca en una cola (Redis, RabbitMQ, SQS)
- La API regresa inmediatamente con una respuesta 202 Aceptada y un ID de trabajo.
- Un proceso de trabajo toma el trabajo y lo ejecuta de forma asincrónica.
- El cliente consulta el estado del trabajo o recibe una devolución de llamada de webhook al finalizar.
Casos de uso comunes de asíncrono
Envío de correo electrónico: las operaciones SMTP tardan entre 500 ms y 3 s, según el proveedor. Poner en cola los correos electrónicos reduce el tiempo de respuesta de la API y permite la lógica de reintento para fallas transitorias sin bloquear al usuario.
Generación de PDF: la generación de facturas, informes o archivos de exportación consume mucha CPU y mucha memoria. Ejecutarlos en trabajadores dedicados evita la contención de recursos con el manejo de solicitudes de API.
Entrega de webhooks: los webhooks salientes dependen de la disponibilidad del servidor de terceros. Ponga en cola las entregas de webhooks con reintentos de retroceso exponencial (1, 2, 4, 8, hasta 5 minutos) para manejar fallas temporales sin bloquear su sistema.
Importación y exportación de datos: el procesamiento de cargas CSV con 100 000 filas nunca debería ocurrir en un ciclo de solicitud. Acepte la carga, devuelva un ID de trabajo y procese filas en lotes.
Selección de cola
| Tecnología de colas | Mejor para | Consideraciones |
|---|---|---|
| BullMQ (respaldado por Redis) | Aplicaciones Node.js, integración NestJS | Gran experiencia para desarrolladores, panel integrado |
| ConejoMQ | Sistemas multilingües, enrutamiento complejo | Maduro, admite patrones de reconocimiento de mensajes |
| AWSSQS | Infraestructura administrada y sin servidores | Sin gestión de servidores, pago por mensaje |
| Kafka | Streaming de eventos, alto rendimiento | Exagerado para colas de trabajo simples, excelente para la búsqueda de eventos |
Optimización de respuesta
Más allá de la lógica de la aplicación, la respuesta en sí se puede optimizar en cuanto a tamaño y velocidad de entrega.
Compresión
Habilite la compresión de respuesta para reducir el tamaño de la carga útil en la red. Los algoritmos de compresión modernos reducen significativamente las cargas útiles basadas en texto (JSON, HTML, CSS, JavaScript).
| Algoritmo | Relación de compresión | Costo de la CPU | Soporte del navegador |
|---|---|---|---|
| zip | Reducción del 60-75% | Bajo | Universales |
| Brotli | Reducción del 70-85% | Moderado | Todos los navegadores modernos |
| zstd | Reducción del 70-85% | Bajo | Emergente (aún no universal) |
Utilice Brotli para recursos estáticos (precomprimidos en el momento de la compilación) y gzip como respaldo para respuestas dinámicas. En NestJS, el middleware de compresión maneja esto automáticamente, pero en producción, deje que Nginx maneje la compresión para descargar la CPU de su servidor de aplicaciones.
Selección de campo
Permita que los consumidores de API soliciten solo los campos que necesitan. GraphQL hace esto de manera inherente, pero las API REST pueden admitir la selección de campos con un parámetro de consulta ?fields=id,name,price. Esto reduce el tamaño de la carga útil y puede optimizar las consultas de la base de datos seleccionando solo las columnas necesarias.
Encabezados de almacenamiento en caché de respuesta
Establezca encabezados Cache-Control apropiados en las respuestas de API. Los puntos finales de la lista pública (productos, categorías) pueden usar Cache-Control: public, max-age=300 para almacenar en caché durante 5 minutos. Los puntos finales autenticados deben usar Cache-Control: private, no-cache para evitar el almacenamiento en caché de CDN y al mismo tiempo permitir el almacenamiento en caché del navegador con revalidación.
Para obtener más información sobre estrategias de almacenamiento en caché, consulte nuestra guía detallada sobre almacenamiento en caché de Redis, CDN y HTTP.
Gestión de conexión
Las conexiones HTTP y de bases de datos son recursos finitos que deben administrarse cuidadosamente bajo carga.
Agrupación de conexiones de bases de datos
Un grupo de conexiones mantiene un conjunto de conexiones de bases de datos reutilizables. Sin agrupación, cada solicitud de API abre una nueva conexión de base de datos (entre 50 y 100 ms de sobrecarga) y la cierra después de la respuesta. Con la agrupación, las solicitudes toman prestadas conexiones del grupo y las devuelven cuando terminan.
Fórmula para dimensionar el grupo: conexiones = (core_count * 2) + Effective_spindle_count. Para un servidor de 4 núcleos con almacenamiento SSD, entre 10 y 20 conexiones por instancia de aplicación es un buen punto de partida. Supervise la utilización del grupo: si supera regularmente el 80 %, aumente el tamaño del grupo u optimice la duración de la consulta.
HTTP mantener activo
Habilite HTTP keep-alive para conexiones a servicios ascendentes (bases de datos, Redis, API externas). Esto reutiliza las conexiones TCP en lugar de establecer nuevas por solicitud, lo que elimina el protocolo de enlace TCP y la sobrecarga de negociación TLS (50-200 ms por nueva conexión).
Preguntas frecuentes
¿Qué límites de velocidad debo establecer para una API pública?
Comience con límites conservadores y ajústelos según patrones de uso legítimos. Un punto de partida común es 100 solicitudes por minuto para usuarios autenticados y 20 solicitudes por minuto para usuarios anónimos. Supervise las tasas de respuesta 429: si los usuarios legítimos alcanzan los límites con frecuencia, increméntelos. Proporcione límites más altos para los niveles de API premium.
¿Cómo manejo la paginación cuando los datos cambian entre páginas?
La paginación basada en cursor maneja esto de forma natural porque se ancla a una posición específica en los datos ordenados. Con la paginación desplazada, los resultados del documento pueden cambiar entre páginas. Para casos de uso críticos (informes financieros, exportaciones de datos), tome una instantánea de los datos al comienzo de la paginación y pagina sobre la instantánea.
¿Debería usar REST o GraphQL para mejorar el rendimiento?
REST con selección de campos y almacenamiento en caché adecuado es más rápido para puntos finales simples y bien definidos. GraphQL elimina la recuperación excesiva y insuficiente para requisitos de datos complejos, pero agrega una sobrecarga de análisis de consultas y dificulta el almacenamiento en caché HTTP. Utilice REST para API públicas con necesidades de almacenamiento en caché y GraphQL para API internas que cumplan con requisitos complejos de datos de interfaz.
¿Cómo superviso el rendimiento de la API en producción?
Realice un seguimiento de los tiempos de respuesta P50, P95 y P99 por punto final. Establezca alertas cuando P95 infrinja su SLO (normalmente entre 200 y 500 ms). Utilice el seguimiento distribuido para desglosar el tiempo dedicado a la base de datos, la caché, los servicios externos y la lógica de la aplicación. Consulte nuestra guía sobre monitoreo y observabilidad para una configuración detallada.
¿Qué sigue?
Comience por auditar los puntos finales de su API en busca de paginación faltante, puntos finales públicos desprotegidos sin limitación de velocidad y operaciones sincrónicas que deberían ser asíncronas. Estos tres cambios normalmente reducen los tiempos de respuesta de P95 entre un 50 y un 70 % y previenen los incidentes de producción más comunes.
Para obtener una perspectiva completa de la ingeniería de rendimiento, consulte nuestra guía fundamental sobre ampliar su plataforma empresarial. Para conocer la capa de base de datos que impulsa su API, lea nuestra guía de optimización de consultas.
ECOSIRE crea API de alto rendimiento para plataformas empresariales en Odoo ERP y arquitecturas personalizadas. Contáctenos para una revisión del rendimiento de la API.
Publicado por ECOSIRE: ayuda a las empresas a escalar con soluciones impulsadas por IA en Odoo ERP, Shopify eCommerce y OpenClaw AI.
Escrito por
ECOSIRE TeamTechnical Writing
The ECOSIRE technical writing team covers Odoo ERP, Shopify eCommerce, AI agents, Power BI analytics, GoHighLevel automation, and enterprise software best practices. Our guides help businesses make informed technology decisions.
ECOSIRE
Haga crecer su negocio con ECOSIRE
Soluciones empresariales en ERP, comercio electrónico, inteligencia artificial, análisis y automatización.
Artículos relacionados
Integración de la API de Hepsiburada con Odoo: guía de configuración completa
Guía completa para integrar Hepsiburada con Odoo ERP vía API. Automatice pedidos, inventario y cumplimiento en el mercado confiable de Turquía.
Shopify Integration Hub: Cómo conectar Shopify a cualquier sistema en 2026
Guía completa para integraciones de Shopify: API, webhooks, middleware, métodos iPaaS. Conecte Shopify a ERP, contabilidad, CRM, mercados y sistemas POS.
Limitación de tasa de API: patrones y mejores prácticas
Limitación de tasa de API maestra con depósito de tokens, ventana deslizante y patrones de contador fijos. Proteja su backend con el acelerador NestJS, Redis y ejemplos de configuración del mundo real.
Más de Performance & Scalability
Depuración y monitoreo de Webhook: la guía completa de solución de problemas
Domine la depuración de webhooks con esta guía completa que cubre patrones de falla, herramientas de depuración, estrategias de reintento, paneles de monitoreo y mejores prácticas de seguridad.
Prueba de carga de k6: pruebe sus API antes del lanzamiento
Domine las pruebas de carga de k6 para las API de Node.js. Cubre aumentos de usuarios virtuales, umbrales, escenarios, HTTP/2, pruebas de WebSocket, paneles de Grafana y patrones de integración de CI.
Configuración de producción de Nginx: SSL, almacenamiento en caché y seguridad
Guía de configuración de producción de Nginx: terminación SSL, HTTP/2, encabezados de almacenamiento en caché, encabezados de seguridad, limitación de velocidad, configuración de proxy inverso y patrones de integración de Cloudflare.
Ajuste del rendimiento de Odoo: PostgreSQL y optimización del servidor
Guía experta para ajustar el rendimiento de Odoo 19. Cubre la configuración, indexación, optimización de consultas, almacenamiento en caché de Nginx y dimensionamiento del servidor de PostgreSQL para implementaciones empresariales.
Odoo vs Acumatica: ERP en la nube para empresas en crecimiento
Comparación de Odoo y Acumatica para 2026: modelos de precios únicos, escalabilidad, profundidad de fabricación y qué ERP en la nube se adapta a su trayectoria de crecimiento.
Prueba y seguimiento de agentes de IA en producción
Una guía completa para probar y monitorear agentes de IA en entornos de producción. Cubre marcos de evaluación, observabilidad, detección de deriva y respuesta a incidentes para implementaciones de OpenClaw.