System Design/02 - Componentes/Content Delivery Networks2 min
Pull CDNs
- Que problema isso resolve?
- Quando usar / quando NÃO usar?
- Qual o principal trade-off?
- Como isso falha em produção?
Conceito
A CDN busca o conteúdo na origem no primeiro pedido e o guarda pelo TTL. Você não publica nada — só aponta a CDN para a origem.
1º usuário → borda (MISS) → origem → guarda → entrega
2º usuário → borda (HIT) → entrega direto
É o modelo padrão de CloudFront, Cloudflare, Fastly e Akamai — e o que quase todo site usa.
Como o cache é controlado
| Header | Efeito |
|---|---|
Cache-Control: max-age=3600 |
Guarda por 1 hora |
Cache-Control: s-maxage=86400 |
TTL só para caches compartilhados (CDN) |
Cache-Control: no-store |
Nunca guarda |
stale-while-revalidate |
Serve o velho enquanto revalida em background |
ETag / Last-Modified |
Revalidação condicional — 304 Not Modified sem corpo |
Cache key
O que diferencia uma entrada de outra: URL, query string, e os headers que você mandar variar (Vary). Incluir headers desnecessários (cookie, user-agent completo) fragmenta o cache e destrói o hit rate — cada usuário passa a ter sua própria entrada.
Trade-offs
O ganho é operacional: zero esforço de publicação, e a CDN só armazena o que realmente é pedido.
O custo aparece no primeiro acesso de cada borda. Com 300 pontos de presença, o mesmo arquivo pode ser buscado 300 vezes na origem. Num lançamento com tráfego alto, muitos usuários chegam simultaneamente antes do primeiro cache existir — é o cache stampede, e a origem leva o impacto todo de uma vez. As defesas são request coalescing (a borda agrupa pedidos idênticos numa só ida à origem) e camadas de cache regional entre borda e origem.
O segundo custo é a invalidação. Com TTL de 24 h, uma correção urgente demora até um dia para aparecer — a menos que você faça purge, que é lento, às vezes cobrado, e nunca instantâneo em todas as bordas.
A solução consagrada evita o problema: versionar a URL (app.a3f9c1.js). Conteúdo imutável ganha TTL de um ano, e publicar significa gerar um nome novo. Não há o que invalidar.
Exemplo prático
Um site com 500 mil imagens, das quais 2% concentram quase todo o acesso.
Com pull, a CDN acaba guardando só essas 2%. Com Push CDNs você teria de publicar as 500 mil e pagar armazenamento por todas — inclusive as que ninguém pede.
O index.html recebe max-age=60 (muda com frequência, precisa propagar rápido). Os assets versionados recebem max-age=31536000, immutable. O resultado é hit rate alto e deploy que aparece em um minuto, sem purge nenhum.
Relacionado
Parte de Content Delivery Networks · roadmap.sh/system-design