¿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 contenido | Tú subes contenido al CDN proactivamente | El CDN obtiene del origen en la primera solicitud |
| Mejor para | Contenido estático que cambia infrecuentemente | Contenido dinámico o frecuentemente actualizado |
| Costo de almacenamiento | Mayor (contenido almacenado proactivamente) | Menor (solo cachea contenido solicitado) |
| Latencia primera solicitud | Baja (contenido ya en el edge) | Mayor (debe obtener del origen) |
| Carga en origen | Mínima después del push inicial | Varía según ratio de cache hit |
| Complejidad | Requiere pipeline de subida | Configuració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 |
|---|---|---|
| Cloudflare | Tier gratuito, Workers en el edge, protección DDoS | Apps web, APIs, propósito general |
| CloudFront | Integración profunda con AWS, Lambda@Edge | Arquitecturas basadas en AWS |
| Akamai | Red más grande, funciones enterprise, seguridad avanzada | Enterprise, streaming de media |
| Fastly | Purga instantánea, Compute@Edge, logging en tiempo real | Contenido dinámico, aceleración de API |
| Vercel Edge Network | Automático con Next.js, soporte ISR, cero configuración | Next.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