GH GambleHub

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.
Exemplo (estática, ano):

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.

Estilo Gastly (pseudo):

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

TipoTTL CDN (`s-maxage`)Navegador ('max-age')Opcional
Assetas versionadas ('/app. a1b2. js`)1 ano1 ano`immutable`; deficiência não necessária
Diretórios/Lendings1-10 min30-120 c`stale-while-revalidate=10–30 мин`
Imagens (ressalvas)10-60 min5-15 minVary по `Accept` (webp/avif)
API GET (armazenável)10-120 c0-30 cSomente Idempotentes; 'stale-if-erro' 5-60 min
Erros 500/timeout00Negative-cache 30-120 s (em CDN), não armazenar 401/403/POST

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.

Exemplo (API, 30 s + SWR):

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.

Contact

Entrar em contacto

Contacte-nos para qualquer questão ou necessidade de apoio.Estamos sempre prontos para ajudar!

Telegram
@Gamble_GC
Iniciar integração

O Email é obrigatório. Telegram ou WhatsApp — opcionais.

O seu nome opcional
Email opcional
Assunto opcional
Mensagem opcional
Telegram opcional
@
Se indicar Telegram — responderemos também por lá.
WhatsApp opcional
Formato: +indicativo e número (ex.: +351XXXXXXXXX).

Ao clicar, concorda com o tratamento dos seus dados.