CDN caching și optimizare TTL
Scurt rezumat
Un cache CDN este un „accelerator + scut” între utilizator și origine. Funcționează bine atunci când:1. Cheia cache este stabilă și nu conține „zgomot”.
2. Politica TTL sub sarcină: 's-maxage '/' max-age' + 'stale-while-escalate/if-error'.
3. Dizabilitatea este gestionată: prin etichete/prefixe + purjare „moale”.
4. Sunt incluse memoria cache/scutul de origine și memoria cache negativă.
5. Există o observabilitate: hit-raport de straturi, p95 TTFB, return share 304.
Anteturile de bază și ce înseamnă ele
„Cache-Control”:- 'max-age =
' - TTL pentru browser. - 's-maxage =
' - TTL pentru CDN/proxy (suprapuneri 'max-age'). - 'stale-while-revalidate =
' - dă învechit, actualizează în paralel. - 'stale-if-error =
' - îl returnăm pe cel depășit atunci când apare eroarea de origine. - „imuabil” - resursa nu se modifică (potrivită pentru activele versionate).
- „ETag ”/„ Ultima modificare” - condiții pentru 304, salvați originea octeților/procesorului.
- „Vary” - o listă de antete care afectează cheia cache (utilizați cu reținere!).
- „Surogat-Control” - „extins” Cache-Control pentru CDN (dacă este acceptat).
- „Expiră” - învechit, dar încă contabilizat de către clienți.
Cache-Control: public, max-age=31536000, immutable
Exemplu (semi-difuzor cu obsolescență sigură):
Cache-Control: public, s-maxage=300, max-age=60, stale-while-revalidate=600, stale-if-error=86400
ETag: "a1c3..."
Proiectarea și normalizarea cheilor cache
Scopul este, în esență, aceleași cereri de a cădea în același obiect.
Normalizarea URL-ului: caz, slashes dublu, slash trailing, ordinea parametrilor de interogare.
Ignorați "zgomot": "utm _'," fbclid "," gclid ", etichete arbitrare ref.
Limitat Vary: numai titluri cu adevărat semnificative ('Accept-Encoding', uneori 'Accept', 'Accept-Language' pentru locale).
Clasa de dispozitiv: dacă este necesar, utilizați 2-3 clase (mobil/desktop/tabletă), nu nesfârșite ramuri de utilizator-agent.
Contextul Auth: nu cache privat în mod implicit; utilizați URL-uri semnate/cookie-uri-by-pass sau căi publice/private separate.
Surrogate-Key: product:123 catalog
Cache-Control: public, s-maxage=300, stale-while-revalidate=600
Vary: Accept-Encoding
Strategii TTL după tipul de conținut
Politici de invaliditate
Prin URL/Prefix: "matura totul sub "/static/2025-11-05/".
By Tag/Key: „eliminaţi toate 'catalog' şi 'produs: 123'”.
Purjare moale: marcați ca învechit, nu ștergeți obiectul - reumplere mai rapidă.
Event-driven: CI/CD sau admin event invocă webhook „invalidate tag-uri”.
Recomandare: combina ambele tactici: căi de versionare pentru active + tag-purge pentru conținut/pagini.
Memorie cache pe niveluri, scut de origine и prewarm
Memorie cache pe niveluri: straturile regionale CDN → mai puține cereri de origine.
Scutul de origine: un singur „scut” POP la origine - îmbunătățește raportul dintre localitate și hit.
Prewarm (pre-preluare): Încălziți adresele URL/cache fierbinți înainte de eveniment/lansare.
Memorie cache negativă: 5xx/Timeout cache pentru o perioadă scurtă de timp (30-120 s), astfel încât să nu copleșească originea cu o furtună de retras.
API Cache: Când puteți
Numai GET/HEAD și idempotent.
Cheie: cale + interogări esențiale (de exemplu, "? category =... & page =... ').
Validare: „ETag ”/„ Ultima modificare” și scurt „s-maxage”.
Filtre după utilizator: aduceți personalizarea la funcția client/margine sau utilizați semnate-cereri + răspuns „public”.
Cache-Control: public, s-maxage=30, max-age=5, stale-while-revalidate=120, stale-if-error=600
ETag: "feed-v42"
Protecție împotriva otrăvirii cu cache
Hard URL/normalizare antet; lista albă a parametrilor din cheie.
Tăierea anteturilor/duplicatelor suspecte („X-Forwarded-”, extins „Accept”).
Limitați „Vary” și controlați dimensiunea/numărul de antete.
Separarea domeniului: privat/admin - pe un nume separat, fără memorie cache.
Validarea răspunsurilor: nu cache 4xx (cu excepția 404 pentru static), nu cache „utilizator” pagini fără o politică explicită.
Compresie și formate
Brotli pentru text (js/css/json), gzip - rezervă; activele pre-comprimate sunt acceptabile.
Imagini: webp/avif unde suport; utilizați „Vary: Accept” + instrumente derivate.
Interval-cereri pentru video/audio: CDN cache bucăți.
Negocierea conținutului: Mențineți cardinalitatea cheie scăzută (clasa dispozitivului în loc de UA brute).
Observabilitate și SLO
Măsurători de taste
Hit-ratio (după bytes/requires) на edge/tier/shield.
p50/95/99 TTFB în funcție de regiune și tip (static/API).
Rata de umplere/ieșirea originii - cât de mult merge la origine.
304 rata și dimensiunea medie de răspuns.
Bugetul de eroare: cota de „stale-if-error ”/„ SWR” probleme; frecvența de purjare.
Exemple SLO
'p95 TTFB' statics regional ≤ 120-150 ms, API GET cache ≤ 200-250 ms.
Statica hit-ratio ≥ 90%, semi-difuzoare ≥ 60%.
Procentul de răspunsuri din ramura veche cu erori ≤ 0. 5% în 30 de zile.
Config foi de ieftin
Nginx (proxy invers înainte de CDN sau în auto-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;
}
}
Trimisul (SWR + negativ-cache, concept)
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
Anteturi pentru active „rapide”
Cache-Control: public, max-age=31536000, immutable
ETag: "hash"
Content-Encoding: br
Anteturi pentru semi-difuzoare (cataloage)
Cache-Control: public, s-maxage=600, max-age=120, stale-while-revalidate=1800, stale-if-error=86400
Vary: Accept-Encoding, Accept
FinOps: Cum economisește bani
↓ de origine de ieșire, mai puțină încărcare CPU/DB → costuri de infrastructură mai mici.
Mai puține cereri pentru backend-uri plătite (căutare/index/imagini).
Țintă metrică: $/scădere în p95 și $/scădere în ieșire cu 1 GB - urmări efectul post-lansare.
iGaming/fintech specific
Cataloage furnizor/active: căi versionate + TTL anual.
Aterizări eveniment/turneu: 1-5 min 's-maxage' + 'SWR' pentru 10-30 min; tag-purge pe upgrade.
Pagini Liv (coeficienți/tabele): cache parțial de blocuri JSON, scurt TTL (5-30 s), pentru blocuri personale - randare client.
PSP/puncte finale de plată: nu faceți cache, strict' no-store "; Cache numai cărți de referință (tabele BIN, stări).
Antibot: caching static/GET, rute gri pentru ASN-uri suspecte; Ţine 'Vary' departe de titlurile zgomotoase.
Lista de verificare a implementării
- Cheia cache descrisă: normalizarea URL-ului, lista interogărilor permise, 'Vary' numai pentru cea dorită.
- Căi publice/private separate; privat - „nu-magazin” și by-pass CDN.
- Scări TTL după tipul de conținut introdus; configurat „SWR/if-error”.
- cache-ul pe niveluri + scutul de origine configurat; negativ-cache 5xx (scurt) activat.
- Există etichetă/URL purjare, purjare moale; integrarea cu CI/CD.
- Include compresie (br/gzip), formate de imagine web, și interval de răspunsuri.
- Metrics: hit-ratio by layer, p95 TTFB, rată 304, ieșire de origine; alerte la eşecuri.
- Playbooks: cache warm-up înainte de vârfuri, epurare de urgență, degradarea originii.
Erori comune
Active non-versio cu un TTL mare → pachete „lipicioase” de la utilizatori.
„Vary” excesiv (prin „User-Agent”, toate antetele) → o explozie de cardinalitate și un raport de succes scăzut.
Caching 4xx/401/403/conținut privat.
Lipsa memoriei cache negative → o avalanșă de cereri de origine degradată.
Nu există tag-purjare → curățare masivă punct și furtună re-umple.
Cheia cache include parametrii UTM/ref „zgomotoși”.
Prea scurt TTL pentru statici → sarcină suplimentară pe CDN și origine.
Mini playbook-uri
1) Încălziți memoria cache înainte de eveniment
1. Colectarea URL-urilor de top-N prin jurnale → 2) Prefetch paralel (rată limitată) pe regiuni → 3) Verificați ↑ hit-ratio și p95 ↓.
2) Catologi de urgență de purjare moale
1. Trimiteți 'PURGE '/tag-clear → 2) CDN dă vechi și trage în sus proaspăt cu fundalul → 3) Verificați dacă nu există vârfuri pe origine.
3) Eșecul originii
1. „stale-if-error” ajută X ore → 2) Activați bannerul „lucrare tehnică” pe margine → 3) La recuperare - încălzirea țintă.
Rezultat
Strategie CDN puternică = cheie cache corectă + TTL semnificativă cu SWR/if-error + handicap gestionat + niveluri/scut + observabilitate. Fixați politica în anteturi și IaC, măsurați raportul de succes și p95, intenționați să vă încălziți până la vârfuri - iar utilizatorii vor primi întotdeauna un răspuns rapid, iar originea va rămâne în viață chiar și în cea mai fierbinte oră.