Polling

Protocolos Y Transporte Security Notes Jan 6, 2025 JAVASCRIPT

Definition

¿Recuerdas ser niño en un viaje largo en coche, preguntando “¿Ya llegamos?” cada cinco minutos? Eso es polling. Tus padres no te avisaban proactivamente cuando llegarían - tú seguías preguntando a intervalos regulares. En el mundo de las APIs, el polling funciona exactamente igual: el cliente pregunta repetidamente al servidor “¿Hay algo nuevo?” a intervalos fijos, haya o no datos nuevos que reportar.

El polling es la forma más simple de obtener actualizaciones de un servidor porque usa peticiones HTTP simples que funcionan en todas partes. El cliente configura un temporizador, dispara una petición cada X segundos, comprueba si la respuesta contiene algo nuevo, y lo procesa. Sin protocolos especiales, sin conexiones persistentes, sin problemas de firewall. El servidor trata cada petición como cualquier otra - sin estado y simple. Esta universalidad es la razón por la que el polling sigue siendo popular a pesar de ser ineficiente: funciona en cualquier navegador, detrás de cualquier firewall corporativo, a través de cualquier proxy.

El problema del polling es el desperdicio. Si haces polling cada 5 segundos y los datos cambian una vez por hora, 719 de 720 peticiones no devuelven nada nuevo. Cada petición consume ancho de banda, CPU del servidor, consultas a base de datos, y batería del móvil - todo para un “no, nada todavía.” Por eso el polling es adecuado para escenarios donde la simplicidad supera a la eficiencia, las actualizaciones son razonablemente frecuentes, o la precisión en tiempo real no es crítica. Para una app del tiempo que actualiza cada hora, hacer polling cada 10 minutos está bien. Para una app de trading donde los milisegundos importan, el polling es la herramienta equivocada.

Example

El polling impulsa innumerables aplicaciones donde la simplicidad y compatibilidad superan la necesidad de actualizaciones en tiempo real:

Clientes de Email Comprobando Correo Nuevo: Cuando abres Gmail o Outlook en tu móvil, no mantiene una conexión constante al servidor. En cambio, hace polling cada pocos minutos: “¿Hay emails nuevos?” El servidor devuelve o los mensajes nuevos o una respuesta vacía. La mayoría de apps de email te permiten configurar el intervalo de polling - más frecuente significa notificaciones más rápidas pero más consumo de batería.

Actualización del Feed de Redes Sociales: Cuando deslizas hacia abajo para refrescar Instagram o Twitter, estás disparando un poll inmediato. Pero incluso cuando no estás deslizando, la app hace polling periódicamente en segundo plano para actualizar tu feed, comprobar nuevas notificaciones, y obtener listas de historias actualizadas. El banner de “nuevas publicaciones disponibles” aparece cuando un poll devuelve contenido nuevo.

Monitorización de Dispositivos IoT: Los dashboards de casas inteligentes hacen polling a sensores regularmente. Tu termostato Nest podría hacer polling cada 30 segundos para comprobar la temperatura, tu controlador de cámara de seguridad hace polling cada minuto buscando eventos de movimiento, tu medidor inteligente hace polling cada hora para el consumo energético. Cada sensor es demasiado simple para mantener conexiones WebSocket, así que el polling encaja perfectamente.

Estado de Build en CI/CD: Cuando subes código a GitHub y esperas que tu build complete, la UI de GitHub hace polling a la API de estado del build cada pocos segundos. Ese círculo girando no está conectado al servidor de build en tiempo real - es tu navegador preguntando “¿Ya terminó? ¿Ya terminó? ¿Ya terminó?” hasta que el build finaliza.

Apps de Seguimiento de Vuelos: Flightradar24 y apps similares hacen polling a APIs de posición de aeronaves. Cada pocos segundos, solicitan posiciones actualizadas de todos los vuelos rastreados. Los datos cambian constantemente pero no en tiempo real - las posiciones de vuelos se actualizan cada pocos segundos de todos modos, así que hacer polling a esa frecuencia es perfectamente adecuado.

Analogía

Como revisar tu buzón cada hora esperes correo o no. A veces hay algo nuevo, frecuentemente no, pero revisas de todas formas en un horario.

Diagrama

sequenceDiagram
    participant C as Cliente
    participant S as Servidor

    loop Cada 5 segundos
        C->>S: GET /api/updates
        Note right of S: Buscar datos
        S->>C: 200 OK (vacío)
        Note over C: Esperar 5s...

        C->>S: GET /api/updates
        Note right of S: Buscar datos
        S->>C: 200 OK (vacío)
        Note over C: Esperar 5s...

        C->>S: GET /api/updates
        Note right of S: ¡Datos nuevos!
        S->>C: 200 OK {"mensaje": "Hola"}
        Note over C: Procesar datos
        Note over C: Esperar 5s...

        C->>S: GET /api/updates
        Note right of S: Buscar datos
        S->>C: 200 OK (vacío)
    end

    Note over C,S: La mayoría de peticiones
devuelven vacío (ineficiente pero simple)

Code Example


// Simple polling implementation
setInterval(async () => {
  try {
    const response = await fetch('/api/notifications');
    const data = await response.json();

    if (data.notifications.length > 0) {
      displayNotifications(data.notifications);
    }
  } catch (error) {
    console.error('Polling error:', error);
  }
}, 10000); // Poll every 10 seconds

Notas de Seguridad

SECURITY NOTES

Requisitos Principales:

  • Implementa rate limiting para prevenir abuso de polling.
  • Usa autenticación para cada petición de polling.
  • Considera implementar backoff exponencial para errores.

Mejores Prácticas:

  • Establece intervalos de polling razonables para prevenir sobrecarga del servidor.
  • Monitorea patrones de polling que indiquen scraping o abuso.
  • Usa ETags para reducir transferencia innecesaria de datos..

Standards & RFCs