DevPath · Aprende a programar ESPTEN

Observabilidad y rendimiento

Rendimiento: caché, lazy loading y la BD

La regla de oro: el trabajo más rápido es el que no haces

Optimizar el rendimiento es, casi siempre, evitar trabajo repetido: no recalcular, no volver a pedir, no enviar lo que ya está. La herramienta central para eso es la caché, y conviene pensarla en niveles.

Caché por niveles

  1. Navegador / HTTP: el cliente guarda respuestas según las cabeceras Cache-Control y ETag. Si el recurso no cambió, el servidor responde 304 Not Modified y no reenvía el cuerpo. Coste de red: cero.

  2. CDN para estáticos: una red de servidores cercanos al usuario sirve imágenes, JS y CSS desde el borde, sin tocar tu origin. Más cerca = menos latencia y menos carga en tu backend.

  3. Caché en el backend (Redis) con el patrón cache-aside:

    ¿está en caché?  → sí → devuélvelo (rápido)
                     → no → ve a la BD, guarda el resultado en caché, devuélvelo
    

    La aplicación gestiona la caché "al lado" de la BD. Hay que decidir el TTL (cuánto vive el dato) e invalidar la entrada cuando el dato cambia, o servirás datos viejos. Invalidar una caché es uno de los problemas difíciles de verdad.

En el frontend: enviar menos y más tarde

En la base de datos: índices y el problema N+1

La BD suele ser el cuello de botella. Dos clásicos:

Mide antes de optimizar. "Creo que esto es lento" no es un dato; un p95 y una traza, sí. Optimizar a ciegas añade complejidad sin garantía de mejora.

Ejemplos

Cache-aside con un Map: no recalcular lo ya calculado

function cachear(fn) {
  const cache = new Map();
  return function (clave) {
    if (cache.has(clave)) return cache.get(clave);
    const valor = fn(clave);
    cache.set(clave, valor);
    return valor;
  };
}

let llamadas = 0;
const cuadrado = cachear((n) => { llamadas++; return n * n; });
cuadrado(8); cuadrado(8); cuadrado(8);
console.log("resultado:", cuadrado(8), "llamadas reales:", llamadas); // 64, 1

N+1 vs. batching: 1 consulta en lugar de N

// Simula una carga "en bloque" de varios ids de una vez.
function cargarUsuarios(ids) {
  console.log("consultas a la BD:", 1, "para", ids.length, "ids");
  return ids.map((id) => ({ id, nombre: "Usuario " + id }));
}

const ids = [1, 2, 3, 4, 5];
const usuarios = cargarUsuarios(ids); // 1 viaje, no 5
console.log(usuarios.length, "usuarios cargados");
Pon esto en práctica

DevPath es un curso práctico: aquí lees la teoría; en la app la pones en práctica con ejercicios que se ejecutan de verdad, sin conexión.

Empezar gratis en la app →
← Los tres pilares de la observabilidadEscalado: horizontal, balanceadores y stateless →