CDN e otimização TTL
Resumo curto
O CDN-kesh é um «acelerador + escudo» entre o usuário e o origin. Ele funciona bem quando:1. A chave de cachê está estável e não contém «ruído».
2. Política TTL sob carga: 's-maxage '/' max-age' + 'stale-while-revalidate/if-erro'.
3. A deficiência é controlada por marcas/prefixo + purge suave.
4. Incluídos tiered-cachê/origin-shield e negativo-cachê.
5. Há observabilidade de hit-ratio por camadas, p95 TTFB, taxa de retorno 304.
Headers básicos e o que significam
`Cache-Control`:- 'max-age =
' - TTL para o navegador. - 's-maxage =
' - TTL para CDN/proxy (sobrepõe 'max-age'). - 'stale-while-revalidate =
' - Entregando obsoletos, atualizando paralelamente. - 'stale-if-erro =
' - Dê-lo ao erro origin. - 'imutable' - o recurso não muda (adequado para assetas versionadas).
- 'ETag '/' Last-Modificed' - condições para 304, economizando bytes/CPU origin.
- 'Vary' é uma lista de cabeçalhos que afetam a chave do cachê (usar discretamente!).
- O'Surrogate-Control "é um" controle avançado "para CDN (se suportado).
- 'Expires' é obsoleto, mas ainda é considerado pelos clientes.
Cache-Control: public, max-age=31536000, immutable
Exemplo (meio dinâmica com obsolescência segura):
Cache-Control: public, s-maxage=300, max-age=60, stale-while-revalidate=600, stale-if-error=86400
ETag: "a1c3..."
Chave de armazenamento - Design e Normalização
O objetivo é que as mesmas solicitações cheguem ao mesmo objeto.
A normalização do URL é maiúscula, slash duplo, slash trailing, ordem dos parâmetros query.
Ignorar «ruído»: «utm _», «fbclid», «gclid», marcas de formatação aleatórias.
Vary limitado: apenas títulos reais ('Accept-Encoding', às vezes 'Accept',' Accept-Language 'para o local).
Device-class: Se necessário, use 2-3 (mobile/desktop/tablet) em vez dos ramais de user-agente infinito.
Contexto Auth: Por omissão, não acerte o privado; use signed-OUTs/cookies-bypass ou compartilhar caminhos públicos/privados.
Surrogate-Key: product:123 catalog
Cache-Control: public, s-maxage=300, stale-while-revalidate=600
Vary: Accept-Encoding
Estratégias TTL por tipo de conteúdo
Políticas de deficiência
By URL/Preferix: "Limpar tudo sob '/static/2025-11-05/'.
By Tag/Key: «Retirar todo o 'catalog' e 'produt: 123'».
Soft purge: marcar como obsoleto, não apagar o objeto - mais rápido que reencher.
Event-driven: CI/CD ou evento admin chama webhook "invalidate tags'.
Recomendação: junte ambas as táticas: versionização de caminhos para assets + tag-purge para conteúdo/página.
Tiered-cache, origin-shield и prewarm
Tiered-cache: camadas de CDN regionais → menos consultas de origin.
Origin-shield: um POP «escudo» para origin - melhora a localidade e hit-ratio.
Prewarm (pré-fetch): Aquece os URL/dinheiro quentes antes do evento/lançamento.
Negative-cache: Acorde brevemente 5xx/Timeout (30-120 s) para evitar que a tempestade retraia o origin.
API Kesh: quando possível
Apenas GET/HEAD e Idumpotentes.
Chave: caminho + query substancial (por exemplo, '? category =... & page =...').
Validação: 'ETag '/' Last-Modificed' e 's-maxage'.
Filtros por usuário: leve a personalização para o cliente/edge-função ou use a resposta pública.
Cache-Control: public, s-maxage=30, max-age=5, stale-while-revalidate=120, stale-if-error=600
ETag: "feed-v42"
Proteção contra envenenamento de cachê (cachê poisoning)
Normalização rígida de URL/cabeçalho; uma lista branca de parâmetros na chave.
Corte de cabeçalhos/duplicados suspeitos ('X-Forwarded-', 'Accept').
Limite 'Vary' e controle de tamanho/cabeçalho.
Separação de domínios: Privado/Admin - em um nome separado sem cachê.
Validação de respostas: Não cante 4xx (exceto 404 para estáticos), não cante páginas personalizadas sem uma política explícita.
Compactação e formatos
Brotli para texto (js/css/json), gzip - fallback; Assetas pré-comprimidas são válidas.
Images: webp/avif onde suporte; Use 'Vary: Aceitt' + derivativos derivados.
Range-requests para vídeo/áudio: CDN armazena cães.
Conteúdo-Negotion: mantenha o cardinalite baixo da chave (device-class em vez de UA crua).
Observabilidade e SLO
Métricas-chave
Hit-ratio (by bytes/requests) на edge/tier/shield.
p50/95/99 TTFB por região e tipo (estático/API).
Fill-rate/Origin egress - quanto vai para origin.
304 rate e média de resposta.
Error budget: participação 'stale-if-erro '/' SWR' da emissão; frequência purge.
Exemplos SLO
'p95 TTFB' estática regionalmente ≤ 120-150 ms, API GET cajado ≤ 200-250 ms.
Edge hit-ratio estático ≥ 90%, meio dinâmico ≥ 60%.
Proporção de respostas do ramo stale com erros ≤ 0. 5% em 30 dias.
Espartilhos Configh
Nginx (reverse-proxy antes do CDN ou no self-PoP)
nginx proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=CDN:512m max_size=100g inactive=7d;
map $args $clean_args {
"~(^ &)(utm_ gclid fbclid) """; # default $ args simplified example;
}
server {
listen 443 ssl http2;
set $cache_key "$scheme$request_method$host$uri?$clean_args $http_accept $http_accept_encoding";
location /static/ {
proxy_cache CDN;
proxy_cache_key $cache_key;
proxy_ignore_headers Set-Cookie;
add_header Cache-Control "public, s-maxage=86400, max-age=3600, stale-while-revalidate=600" always;
proxy_pass https://origin_static;
}
location /api/public/ {
proxy_cache CDN;
proxy_cache_key $cache_key;
proxy_cache_valid 200 30s;
add_header Cache-Control "public, s-maxage=30, max-age=5, stale-while-revalidate=120, stale-if-error=600" always;
proxy_set_header If-None-Match $upstream_http_etag;
proxy_pass https://origin_api;
}
}
Envoy (SWR + negativo-cachê, conceito)
yaml http_filters:
- name: envoy. filters. http. cache typed_config:
"@type": type. googleapis. com/envoy. extensions. filters. http. cache. v3. CacheConfig typed_config:
"@type": type. googleapis. com/envoy. extensions. cache. simple_http_cache. v3. SimpleHttpCacheConfig
Cache-Control/Surrogate-Control Header Cache Policies
We cache 5xx errors briefly via route/retry policy + local_rate_limit
Headers para assets «rápidos»
Cache-Control: public, max-age=31536000, immutable
ETag: "hash"
Content-Encoding: br
Headers para meio-dinâmico (diretórios)
Cache-Control: public, s-maxage=600, max-age=120, stale-while-revalidate=1800, stale-if-error=86400
Vary: Accept-Encoding, Accept
FinOps: como o dinheiro economiza dinheiro
Egress origin ↓, menos carga CPU/DB → baixo custos de infraestrutura.
Menos solicitações até backends pagos (search/index/images).
Meta metrica: $/redução p95 e $/redução egress de 1GB - Monitore o efeito pós-emergência.
Especificidades para iGaming/Fintech
Diretórios de provedores/assets: caminhos versionados + TTL de um ano.
Lendings de eventos/torneios: 1-5 min 's-maxage' + 'SWR' para 10-30 min; tag-purge na atualização.
Páginas love (coeficientes/tabelas): caixa de armazenamento JSON parcial, TTL curtos (5-30 s), para blocos pessoais - render cliente.
PSP/endpoint de pagamento: Não acenamos, rigoroso 'no-store'; apenas guias de guia (tabelas BIN, estatais) estão em armazenamento.
Antibot: cachê estático/GET, rotas «cinzentas» para ASN suspeito; Não admita 'Vary' por cabeçalhos barulhentos.
Folha de cheque de implementação
- A chave do armazenamento foi descrita: normalização do URL, lista de permissões query, 'Vary' apenas de acordo com o necessário.
- As vias públicas/privadas estão separadas; privado - 'no-store' e bypass CDN.
- Inserir escadas TTL por tipo de conteúdo; configurado por 'SWR/if-erro'.
- Configurados tiered-cache + origin-shield; ativado negative-cache 5xx (curto).
- Há uma tag/URL purge, soft purge; integração com CI/CD.
- A compressão (br/gzip), os formatos de imagem da Web e as respostas range estão ativadas.
- Métricas: hit-ratio by layer, p95 TTFB, 304 rate, origin egress; Alertas para falhar.
- Playbooks: aquecimento do dinheiro antes dos picos, purge de emergência, degradação do origin.
Erros típicos
Assetas sem versões com um grande TTL → bandos «picados» em usuários.
O excesso de 'Vary' (por 'Usuário-Agente', todos os títulos) → uma explosão de radicalidade e um baixo hit-ratio.
Armazenamento de conteúdo privado 4xx/401/403.
Falta de negativo-cachê → uma avalanche de pedidos de origin degradado.
Sem tag-purge → purge em massa e «tempestade» re-fill.
A chave de armazenamento inclui UTM/ref-parâmetros «ruidosos».
TTL curto demais para estática → carga extra de CDN e origin.
Mini-playbooks
1) Aquecimento do cachê antes do evento
1. Coleta o URL top N por logs → 2) Prefetch paralelo (rate-limited) por região → 3) Verificação hit-ratio ↑ e p95 ↓.
2) Batologistas soft-purge de emergência
1. Enviar 'PURGE '/tag-clear → 2) CDN dá stale e fundo puxa frescos → 3) Verificar a falta de espinhos no origin.
3) Falha origin
1. 'stale-if-erro' ajuda X relógio → 2) Ativar o banner de «trabalho técnico» em edge → 3) Por recuperação - alvo warm-up.
Resultado
Forte estratégia CDN = chave de armazenamento correta + TTL sensível com SWR/if-erro + deficiência controlada + tiered/shield + observabilidade. Fixe as políticas em heders e IaC, mede hit-ratio e p95, planeje o aquecimento sob picos - e os usuários sempre receberão uma resposta rápida e o origin permanecerá vivo mesmo na hora mais quente.