GH GambleHub

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.
Exemplu (statică, an):

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.

Stil rapid (pseudo):

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

TipTTL CDN ('s-maxage')Browser ('max-age')În plus
Active versionate ('/app. a1b2. js')1 an1 an„imuabil”; handicap nu este necesar
Cataloage/pagini de destinație1-10 min30-120 s'stale-while-revalidate = 10-30 мин'
Imagini (Resays)10-60 min5-15 minVariază по 'Accept' (webp/avif)
Obțineți API-uri (în cache)10-120 s0-30 sNumai Idempotent; „stale-dacă-eroare” 5-60 min
500/erori de timeout00Memorie cache negativă 30-120 sec (la nivelul CDN), nu cache 401/403/POST

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”.

Exemplu (API, 30 s + SWR):

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ă.

Contact

Contactați-ne

Scrieți-ne pentru orice întrebare sau solicitare de suport.Suntem mereu gata să ajutăm!

Telegram
@Gamble_GC
Pornește integrarea

Email-ul este obligatoriu. Telegram sau WhatsApp sunt opționale.

Numele dumneavoastră opțional
Email opțional
Subiect opțional
Mesaj opțional
Telegram opțional
@
Dacă indicați Telegram — vă vom răspunde și acolo, pe lângă Email.
WhatsApp opțional
Format: cod de țară și număr (de exemplu, +40XXXXXXXXX).

Apăsând butonul, sunteți de acord cu prelucrarea datelor dumneavoastră.