TechLead
Leccion 11 de 30
7 min de lectura
Diseño de Sistemas

Redes de Distribución de Contenido (CDN)

Aprende cómo funcionan los CDNs incluyendo estrategias push vs pull, caché en el borde, invalidación, TTL y arquitecturas multi-CDN para entrega de contenido escalable

¿Qué Es una Red de Distribución de Contenido?

Una Red de Distribución de Contenido (CDN) es una red distribuida geográficamente de servidores proxy y centros de datos diseñada para proporcionar alta disponibilidad y rendimiento distribuyendo contenido más cerca de los usuarios finales. En lugar de que cada solicitud viaje a un único servidor de origen, los CDNs cachean contenido en ubicaciones edge alrededor del mundo, reduciendo dramáticamente la latencia y la carga en el origen.

Los CDNs son esenciales en el diseño de sistemas moderno. Manejan una porción significativa del tráfico global de internet y son usados por prácticamente todas las aplicaciones web a gran escala, desde plataformas de streaming hasta sitios de comercio electrónico.

¿Por Qué Usar un CDN?

  • Latencia Reducida: El contenido se sirve desde la ubicación edge más cercana.
  • Escalabilidad: Los CDNs absorben picos de tráfico y distribuyen la carga.
  • Disponibilidad: Si un nodo edge falla, el tráfico se enruta al siguiente nodo saludable más cercano.
  • Seguridad: Los CDNs proporcionan protección DDoS, WAF y terminación TLS en el borde.
  • Reducción de Costos: Menos solicitudes llegan al servidor de origen.

Cómo Funcionan los CDNs

Cuando un usuario solicita un recurso, el DNS resuelve el dominio al servidor edge CDN más cercano mediante enrutamiento anycast o geo-DNS. El servidor edge verifica su caché. Si el contenido está cacheado (un cache hit), se retorna inmediatamente. Si no (un cache miss), el servidor edge lo obtiene del origen, lo cachea y luego lo sirve al usuario.

// Simplified CDN request flow
interface CDNRequest {
  url: string;
  userLocation: { lat: number; lng: number };
  headers: Record<string, string>;
}

interface EdgeServer {
  id: string;
  location: { lat: number; lng: number };
  cache: Map<string, CachedResponse>;
}

interface CachedResponse {
  body: Buffer;
  headers: Record<string, string>;
  cachedAt: number;
  ttl: number;
}

function handleCDNRequest(request: CDNRequest, edge: EdgeServer): Response {
  const cacheKey = generateCacheKey(request);
  const cached = edge.cache.get(cacheKey);

  if (cached && !isExpired(cached)) {
    // Cache HIT - serve directly from edge
    return {
      body: cached.body,
      headers: { ...cached.headers, "X-Cache": "HIT" },
    };
  }

  // Cache MISS - fetch from origin
  const originResponse = fetchFromOrigin(request.url);
  const ttl = parseTTL(originResponse.headers);

  edge.cache.set(cacheKey, {
    body: originResponse.body,
    headers: originResponse.headers,
    cachedAt: Date.now(),
    ttl,
  });

  return {
    body: originResponse.body,
    headers: { ...originResponse.headers, "X-Cache": "MISS" },
  };
}

function isExpired(cached: CachedResponse): boolean {
  return Date.now() - cached.cachedAt > cached.ttl * 1000;
}

CDN Push vs CDN Pull

Los CDNs se pueden clasificar por cómo se puebla el contenido en los servidores edge. Entender la diferencia es crítico para elegir la estrategia correcta para tu carga de trabajo.

Comparación Push vs Pull CDN

Aspecto Push CDN Pull CDN
Población de contenidoTú subes contenido al CDN proactivamenteEl CDN obtiene del origen en la primera solicitud
Mejor paraContenido estático que cambia infrecuentementeContenido dinámico o frecuentemente actualizado
Costo de almacenamientoMayor (contenido almacenado proactivamente)Menor (solo cachea contenido solicitado)
Latencia primera solicitudBaja (contenido ya en el edge)Mayor (debe obtener del origen)
Carga en origenMínima después del push inicialVaría según ratio de cache hit
ComplejidadRequiere pipeline de subidaConfiguración más simple, solo configura origen

CDN Push

Con un CDN push, tú eres responsable de subir contenido directamente al CDN. Esto te da control total sobre qué se cachea y cuándo. Funciona mejor para recursos estáticos grandes como descargas de software, archivos de video o recursos conocidos de antemano. AWS S3 + CloudFront con identidad de acceso al origen es un patrón común de CDN push.

CDN Pull

Un CDN pull es más común para aplicaciones web. Configuras el CDN con la URL de tu servidor de origen, y el CDN obtiene y cachea contenido de forma perezosa en la primera solicitud. Las solicitudes posteriores se sirven del caché hasta que expira el TTL. Cloudflare y la mayoría de los CDNs de propósito general operan principalmente como CDNs pull.

Cabeceras de Caché y Estrategias de TTL

El comportamiento del caché se controla principalmente a través de cabeceras HTTP. Configurar adecuadamente estas cabeceras es una de las cosas más impactantes que puedes hacer para el rendimiento.

// Common caching header configurations

// Immutable static assets (hashed filenames like main.a1b2c3.js)
const immutableHeaders = {
  "Cache-Control": "public, max-age=31536000, immutable",
  // Cached for 1 year, browser won't even revalidate
};

// Dynamic HTML pages
const htmlHeaders = {
  "Cache-Control": "public, max-age=0, s-maxage=60, stale-while-revalidate=300",
  // s-maxage: CDN caches for 60 seconds
  // stale-while-revalidate: serve stale for 5 min while fetching fresh
};

// API responses
const apiHeaders = {
  "Cache-Control": "private, no-cache",
  // private: CDN must not cache (user-specific data)
  // no-cache: always revalidate with origin
};

// Images and media
const mediaHeaders = {
  "Cache-Control": "public, max-age=86400, stale-while-revalidate=86400",
  // Cache for 1 day, serve stale for 1 more day while refreshing
};

Directivas Clave de Cache-Control

  • max-age: Cuánto tiempo el navegador debe cachear el recurso (en segundos)
  • s-maxage: Cuánto tiempo los cachés compartidos (CDN) deben cachear el recurso. Sobrescribe max-age para CDNs
  • stale-while-revalidate: Servir contenido obsoleto mientras se obtiene una versión fresca en segundo plano
  • immutable: Indica al navegador que el recurso nunca cambiará (usar con URLs con hash de contenido)
  • no-store: Nunca cachear esta respuesta en ningún lugar (datos sensibles)
  • private: Solo el navegador puede cachear esto, no los CDNs (contenido específico del usuario)

Invalidación de Caché CDN

La invalidación de caché es uno de los problemas más difíciles en ciencias de la computación, y los CDNs no son la excepción. Cuando tu contenido cambia, necesitas una estrategia para asegurar que los usuarios vean la versión actualizada.

Estrategias de Invalidación

  • Expiración basada en TTL: El contenido expira automáticamente después del TTL. Simple pero introduce un retraso entre actualizaciones y visibilidad.
  • API de Purga/Invalidación: Decirle explícitamente al CDN que elimine contenido cacheado específico. La mayoría de los CDNs proporcionan una API para esto.
  • Cache Busting vía Versionado de URL: Agregar una versión o hash a la URL (ej. style.a1b2c3.css). Como la URL cambia, el CDN lo trata como contenido nuevo.
  • Claves Sustitutas / Etiquetas de Caché: Etiquetar objetos cacheados con metadatos, luego purgar todos los objetos con una etiqueta dada. Fastly y Cloudflare soportan esto.
// Cache invalidation example using Cloudflare API
async function purgeCache(zoneId: string, urls: string[]): Promise<void> {
  const response = await fetch(
    `https://api.cloudflare.com/client/v4/zones/${zoneId}/purge_cache`,
    {
      method: "POST",
      headers: {
        Authorization: `Bearer ${process.env.CF_API_TOKEN}`,
        "Content-Type": "application/json",
      },
      body: JSON.stringify({ files: urls }),
    }
  );

  if (!response.ok) {
    throw new Error(`Purge failed: ${response.statusText}`);
  }
}

// Purge everything (nuclear option)
async function purgeAll(zoneId: string): Promise<void> {
  await fetch(
    `https://api.cloudflare.com/client/v4/zones/${zoneId}/purge_cache`,
    {
      method: "POST",
      headers: {
        Authorization: `Bearer ${process.env.CF_API_TOKEN}`,
        "Content-Type": "application/json",
      },
      body: JSON.stringify({ purge_everything: true }),
    }
  );
}

Estrategias Multi-CDN

Las aplicaciones a gran escala a menudo usan múltiples proveedores de CDN simultáneamente para mejorar fiabilidad, rendimiento y optimización de costos. Una estrategia multi-CDN enruta tráfico entre proveedores como Cloudflare, CloudFront y Akamai basándose en datos de rendimiento en tiempo real.

Beneficios de Multi-CDN

  • Redundancia: Si un CDN tiene una interrupción, el tráfico se enruta a otro proveedor
  • Optimización de Rendimiento: Enruta usuarios al CDN más rápido para su ubicación
  • Optimización de Costos: Usa diferentes CDNs para diferentes regiones basándose en precios
  • Independencia de Proveedor: Evita dependencia de un solo proveedor

Enfoques de Implementación

  • Enrutamiento basado en DNS: Usa un proveedor DNS como NS1 o Route 53 que soporte enrutamiento basado en rendimiento para dirigir usuarios al CDN más rápido
  • Enrutamiento a nivel de aplicación: Usa un balanceador de carga global o servicio como Cedexis/Citrix ITM para tomar decisiones de enrutamiento en tiempo real
  • Solo failover: Usa un CDN primario con failover automático a un CDN secundario ante fallos en health checks

Proveedores de CDN del Mundo Real

Proveedor Fortalezas Mejor Para
CloudflareTier gratuito, Workers en el edge, protección DDoSApps web, APIs, propósito general
CloudFrontIntegración profunda con AWS, Lambda@EdgeArquitecturas basadas en AWS
AkamaiRed más grande, funciones enterprise, seguridad avanzadaEnterprise, streaming de media
FastlyPurga instantánea, Compute@Edge, logging en tiempo realContenido dinámico, aceleración de API
Vercel Edge NetworkAutomático con Next.js, soporte ISR, cero configuraciónNext.js y apps Jamstack

Consejos de CDN para Entrevistas de Diseño

  • Siempre menciona CDN cuando discutas sistemas con muchas lecturas o que sirvan assets estáticos
  • Discute el ratio de cache hit como métrica clave (apunta a 90%+ para assets estáticos)
  • Considera la estrategia de invalidación de caché como parte de tu diseño
  • Recuerda edge compute para personalización sin perder beneficios de caché (Cloudflare Workers, Lambda@Edge)
  • Menciona distribución geográfica para bases de usuarios globales

Continuar Aprendiendo