trilha

System Design/02 - Componentes/Content Delivery Networks2 min

Pull CDNs

Perguntas-guia
  • 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

Buscar

Busca por título, seção e texto das notas