Módulo 03 // Unidad 05

Tareas programadas eficientes

Procesos en segundo plano que trabajan cuando hace falta, cuanto hace falta y a la hora más limpia

Unidad para alumnos del curso

Comprobando tu sesión…

Inicia sesión con la cuenta de Google con la que estás matriculado para ver esta unidad.

Esa cuenta no tiene acceso a este curso. Prueba con otra.

No se ha podido cargar el inicio de sesión de Google. Comprueba la conexión o si algún bloqueador lo impide, y recarga la página.

Cierras el módulo con el código que se ejecuta sin que nadie lo pida: tareas programadas, sincronizaciones, generación de informes, limpiezas. Como no hay un usuario esperando, es fácil que nadie revise si ese trabajo hace falta, cuánto cuesta o cuándo se ejecuta. Y precisamente por eso, suele ser uno de los sitios con más margen de ahorro.

1 // El trabajo que nadie mira

Casi todas las aplicaciones tienen trabajo en segundo plano:

  • Tareas programadas (cron jobs): «cada noche a las 3:00, genera el informe de ventas».
  • Colas de trabajo: el usuario sube un vídeo y un proceso lo convierte a varios formatos cuando puede.
  • Sincronizaciones: «cada 5 minutos, trae los pedidos nuevos del proveedor».
  • Mantenimiento: copias de seguridad, limpieza de registros, regeneración de índices.

Recuerda el cálculo del módulo 2: una tarea que se ejecuta cada minuto son 525.600 ejecuciones al año. Si cada una tarda un par de segundos de CPU, suman casi 300 horas de procesador. Y a diferencia del código de una petición, nadie nota si esa tarea es lenta o si ya no sirve para nada.

2 // Sondeo frente a eventos

La forma más sencilla de enterarse de un cambio es preguntar periódicamente (polling, sondeo): «¿hay pedidos nuevos?», «¿ha terminado el pago?». Es fácil de programar, pero tiene un problema de fondo: trabaja aunque no pase nada.

La alternativa es la arquitectura basada en eventos: en lugar de preguntar, te avisan cuando algo ocurre.

SONDEO FRENTE A EVENTOS SONDEO · pregunta cada intervalo 22 peticiones · 3 con novedades · retraso hasta el siguiente intervalo EVENTOS · avisa cuando algo cambia 3 mensajes · reacción inmediata algo cambia pregunta vacía tiempo →
Arriba, el sondeo pregunta a intervalos fijos y casi todas sus peticiones vuelven vacías. Abajo, con eventos, sólo hay actividad cuando ocurre algo, y además la reacción es inmediata.
Técnica Cómo funciona Uso típico
Webhooks El otro servicio llama a una URL tuya cuando hay novedades Pagos, repositorios de código, proveedores externos
Colas de mensajes Un servicio publica un mensaje y otro lo consume cuando llega (RabbitMQ, Kafka, colas de la nube) Comunicación entre microservicios
WebSockets y SSE El servidor empuja datos al navegador por una conexión abierta Notificaciones, chats, paneles en tiempo real
Disparadores La base de datos o el almacenamiento lanza una acción al cambiar algo Procesar un fichero al subirlo

Una aplicación de reparto tiene 5.000 clientes con la app abierta, y cada una pregunta al servidor cada 10 segundos si su pedido ha cambiado de estado. De media, cada pedido cambia de estado 4 veces en la hora que dura.

  1. Peticiones de sondeo por hora: 5.000 clientes × 360 consultas = 1.800.000 peticiones.
  2. Peticiones con novedades: 5.000 × 4 = 20.000, apenas un 1,1 %.
  3. Con eventos (por ejemplo, SSE): el servidor envía sólo esos 20.000 mensajes, y el cliente se entera en el momento, no hasta 10 segundos después.
Casi el 99 % de las peticiones de sondeo son trabajo inútil: consultas, respuestas y radio del móvil activada para oír «nada nuevo». Mantener conexiones abiertas también consume, pero mucho menos que 1,8 millones de peticiones completas.

El sondeo no es siempre un error. Si el otro sistema no ofrece eventos, o los cambios son muy frecuentes, preguntar puede ser razonable. En ese caso, ajusta el intervalo a la necesidad real (¿de verdad necesitas saberlo cada 10 segundos?) y usa respuestas baratas, como un 304 cuando no hay cambios.

3 // Lotes y trabajo incremental

Cuando la tarea sí tiene que procesar datos, dos técnicas reducen mucho su coste:

Procesar por lotes. Enviar 1.000 correos con 1.000 conexiones, o insertar 10.000 filas con 10.000 sentencias, multiplica el trabajo fijo de cada operación. Agruparlas en lotes (una conexión, un INSERT con muchas filas, una llamada a la API con varios elementos) reparte ese coste fijo.

Procesar sólo lo que ha cambiado. Muchas tareas nocturnas recalculan todo cada vez: todas las estadísticas, todos los productos, todas las miniaturas. Si cada día cambia el 1 % de los datos, el 99 % del trabajo repite resultados que ya existían. El procesamiento incremental guarda una marca (la fecha de la última ejecución, un campo updated_at, un registro de cambios) y trabaja sólo sobre lo nuevo.

Y una tercera, más de sentido común: revisar si la tarea sigue haciendo falta. Informes que nadie abre, sincronizaciones con sistemas que ya no existen, copias de seguridad de entornos abandonados. Es el software zombi del módulo 2, en versión programada.

4 // Elegir la hora

El cuándo también importa, por dos motivos.

Para no crear picos. Si todas las tareas de todos los clientes se programan a las 00:00, los servidores tienen que dimensionarse para ese momento y pasar el resto del día infrautilizados, lo contrario de la proporcionalidad energética que viste en el módulo 2. Repartir las tareas a lo largo de la noche, o añadir un pequeño retraso aleatorio (jitter), aplana la carga. Y conviene evitar que una ejecución empiece antes de que acabe la anterior, porque se acumulan.

Para buscar la electricidad más limpia. Muchas tareas no tienen prisa: el informe tiene que estar listo por la mañana, pero da igual si se genera a la 1:00 o a las 5:00. Es la oportunidad perfecta para el desplazamiento en el tiempo del software consciente del carbono. Con la previsión de intensidad de la red eléctrica, la tarea puede lanzarse en la franja con más renovables. En España, con mucha solar, las horas centrales del día suelen ser más limpias que la noche, así que a veces lo más eficiente es cambiar la costumbre de ejecutarlo todo de madrugada.

Una tarea en segundo plano eficiente reacciona a eventos en lugar de preguntar, trabaja por lotes y sólo sobre lo que ha cambiado, y se ejecuta a una hora elegida con criterio. Y antes que todo eso, alguien se ha preguntado si sigue haciendo falta.

Autoevaluación

¿Por qué suele ser más eficiente reaccionar a eventos que consultar periódicamente?
Porque el sondeo trabaja aunque no haya nada que hacer. Una tarea que pregunta cada minuto si hay novedades gasta recursos en cada vuelta, y la mayoría de las veces la respuesta es «no». Con eventos, el sistema sólo trabaja cuando ocurre algo, y además se entera antes.
¿Qué ventaja tiene procesar sólo los registros que han cambiado desde la última ejecución?
Que el trabajo depende de los cambios y no del tamaño total de los datos. Si una tabla tiene un millón de filas y cambian mil al día, recalcularlo todo cada noche repite 999.000 cálculos innecesarios. El procesamiento incremental hace sólo los mil que importan.
¿Por qué no conviene programar todas las tareas a las 00:00?
Porque se concentran en el mismo momento y crean un pico artificial. Los servidores tienen que dimensionarse para ese pico, aunque el resto del día estén ociosos. Repartir las tareas, o añadirles un pequeño retraso aleatorio, aplana la carga; y si pueden esperar, se pueden mover a las horas en que la electricidad es más limpia.