Ottimizzazione di CDN e latency reduction
1) Obiettivi e mappa dei ritardi
Latency = DNS + TCP/TLS + TTFB (server/origine/cache) + distribuzione di contenuti (RTT x volumi) + render client.
Ottimizzazione = ridurre il numero di RTT, ridurre i byte e spostare i calcoli/cache più vicini all'utente.
2) Architettura CDN
Anycast POPS è un sito di routing BGP vicino.
Tiered cache/Origin Shield è uno strato intermedio «ombrello» che riduce la tempesta miss sull'origine.
Geo-/Regionale routing - riferimento tenante/giurisdizione (sovranità dei dati, licenze).
Failover - Origina/regione ridondante, provini health e interruttore rapido.
3) Cache: chiavi, intestazioni, strategie
3. 1 Chiavi cache (cache key)
L'impostazione predefinita è «scheme + host + path +? query».
Aggiungi solo i parametri desiderati («? v =», «? lang =», «? tenant =»). Gli altri sono in ignore-params.
«Vary» è il minimo: «Accettt-Encoding», «Accettt-Language» (se necessario), «Authorization» di solito rompe la cache.
3. 2 Criteri
Statica pubblica: 'Cache-Control: public, max-age = 31536000, immutabile' + rev (hash nel nome).
Seminamica (cataloghi, regole, FAQ): 's-maxage = 300, stale-while-revalidate = 600, stale-if-errore = 86400'.
API-GET: usa ETAG/Last-Modified, 'SWR/SIE', abilita il coalescing (una sola richiesta a chiave calda).
Private - Risposte personali - sul perimetro tramite edge-compute (ESI/kv) o per-tenant cache.
3. 3 Anti-tempesta
Richiest coalescing - Contrarre le richieste di miss simultanee.
Serve-stale - Restituisci un oggetto obsoleto in caso di errore dell'origine.
Background revalidation - aggiorna sullo sfondo.
4) HTTP/2-3, TCP/TLS e ritorno precoce
HTTP/2: multiplex, compressione dei titoli limitare «max concurrent streams», grandi titoli.
HTTP/3 (QUIC): riduzione importante del TTFB per le perdite mobili/elevate; Tenere d'occhio le soglie iniziali e Retry.
TLS 1. 3: 1-RTT handshake; OCSP stapling; HSTS.
0-RTT: solo per «GET» idipotenti e se i rischi replay sono considerati.
103 Early Hints - Primi «Link: rel = proload» per le risorse critiche.
Preconnect / DNS-prefetch: `<link rel="preconnect" href="https://cdn. example">`.
5) Edge-compute e «personalizzazione sottile»
Sul bordo: censimento dei titoli, geo/tenante-fissazione, marcatura A/B, personalizzazione leggera senza richiesta di origine.
Regola: non memorizzare PII su nodi POP; Cache solo aggregazioni/dati pubblici.
6) Ottimizzazione dei media e dei formati
Immagini: conversione automatica in WebP/AVIF, resize-on-edge, «srcset/sizes», «lazyload».
Compressione: Brotli per testi (HTML/CSS/JS/JSON), gzip fallback.
Video: HLS/DASH, CDN-segment cache, «pratoad = metadata», poster.
Caratteri subset + 'font-display: swap'; ostaggio con una lunga cache.
CSS critico: inline prima schermata il resto è async.
7) pattern API e cache
Idempotent GET - Memorizziamo nella cache le chiavi della query (inclusa la versione dei dati).
ETAG: forte hash di carico utile + 'If-None-Match'.
Surrogate-Control (CDN-specificità) per differenziare il client da Cache-Control.
Signed URLs - per lo statico/media privato.
GraphQL - Normalizzare la chiave cash per operazione/variabile; Utilizzare la cache partial cache/resolver.
WebSockets: per il real-time: riduce i messaggi, comprime (permessage-deflate) e posiziona i chard WS più vicini all'utente.
8) Esempi di configurazione
8. 1 NGINX (origine: cache API-GET)
nginx
We give SWR and ETag location/api/v1/catalog/{
proxy_cache api_cache;
proxy_cache_key "$scheme$request_method$host$uri$is_args$args";
proxy_cache_valid 200 5m;
proxy_cache_use_stale updating error timeout http_500 http_502 http_503 http_504;
add_header Cache-Control "public, s-maxage=300, stale-while-revalidate=600, stale-if-error=86400";
add_header ETag $upstream_http_etag;
proxy_ignore_headers Set-Cookie; # do not break the Set-Cookie proxy_hide_header cache;
proxy_pass http://catalog;
}
8. 2 Fastly VCL (SWR, coalescing, ignore cookies)
vcl sub vcl_recv {
set req. hash_ignore_busy = true; # coalescing if (req. url. qs ~ "^(?!.(lang v)=)") { remove req. url. qs; }
if (req. http. Cookie) { remove req. http. Cookie; }
}
sub vcl_backend_response {
set beresp. ttl = 300s;
set beresp. stale_if_error = 86400s;
set beresp. stale_while_revalidate = 600s;
if (beresp. http. Set-Cookie) { unset beresp. http. Set-Cookie; }
}
8. 3 Cloudflare (Transform Rules, Cache Rules, Early Hints — псевдо)
json
{
"cache_rule": {
"if": "http. request. uri. path matches \"/assets/.\"",
"action": {"cache": {"eligibility":"eligible", "ttl": 31536000}}
},
"transform_rule": {
"set_headers": [{"name":"Cache-Control","value":"public, s-maxage=300, stale-while-revalidate=600"}]
},
"early_hints": {"enable": true}
}
9) Reti mobili e Internet «instabile»
Usare in modo aggressivo HTTP/3; Ridurre le dimensioni del percorso critico (HTML + critical CSS <14 KB).
Priority H2/H3: fissa le priorità (HTML→CSS→JS→media più tardi).
Politica Retrai con jitter, idempotency per API.
Size-budgets e bandling: codice-splitting, deferred JS, rimozione CSS/JS inutilizzato.
10) Osservabilità e SLO
RUM: TTFB, LCP, INP, CLS per regione/ASN/tenanti; distribuzione p95/p99.
Sintetico: percorso di controllo «/health/cdn »per POP.
Cash metriche: hit-ratio overall e per-key; origin fetch rate; coalescing savings.
Alert: calo hit-ratio, crescita origin-egress, degrado H3-quota, 5xx per shield.
11) Specificità iGaming/finanza
Cataloghi giochi/coefficienti: brevi «s-maxage» + SWR; region-aware ключ (`tenant|region|lang`).
Picchi di eventi (partite, battute): riscaldamento della cache (pre-warm), congelamento delle personalizzazioni pesanti, sorgenti mirror.
Pagamenti/ufficio - Non memorizzare la cache privata, ma accelerare attraverso H3 + edge-TLS e la regione vicina.
Giurisdizioni: domini/percorsi per-regione separati; Controlle'Vary: X-Region '.
12) Antipattern
«Vary:» A tutto; la chiave cache dipende dai cookie/intestazioni in eccesso.
Nessuna schermata nera SWR/SIE in caso di guasti brevi dell'origine.
Cancella la cache in tutto anziché disabilitare i punti per tag/chiavi.
Risorse senza revisione dei nomi e con «max-age = 0».
Deny-cache globale per «Authorization» anche dove viene dato il pubblico.
L'assenza di coalescing è una tempesta origina.
Personalizzazione prematura «pesante» su POP.
13) Assegno-foglio prod-pronto
- Anycast POP + tiered/shield; health check e origin failover.
- Le chiavi della cache sono minime; ignorare query/cookies in eccesso; Surrogate-Control.
- SWR/SIE abilitato, coalescing attivo; serve-stale in caso di errore.
- HTTP/3 abilitato; TLS 1. 3; 103 Early Hins è configurato per le risorse critiche.
- Immagini: AVIF/WebP, resize-on-edge; Brotli per i testi.
- API-GET с ETag/Last-Modified; Idampotenza/retrai; non memorizzare profili privati nella cache.
- Precisnect ai domini statici CSS inline critico.
- Metriche: hit-ratio, origin-egress, TTFB/LCP p95, H3, per regione/tenente.
- Piano di riscaldamento della cache prima degli eventi disabilità a punti (tag).
- Documentazione Vary/keys/TTL; playbook incidenti (caduta hit-ratio).
14) TL; DR
Riduce le escursioni all'origine al minimo: tiered/shield + cache-keys corretta + SWR/SIE + coalescing. Attivare HTTP/3/TLS 1. 3, utilizzare 103 Early Hins e precisnect. Comprimere e convertire i media sul bordo, incollare il CSS critico. Per API - ETag, «Vary», Idampotenza e Memorizzazione Intelligente GET. Misurare hit-ratio, TTFB/LCP p95, origin egress e riscaldare la cache in anticipo sui picchi.