Optymalizacja CDN i redukcji opóźnień
1) Cele i mapa opóźnień
Opóźnienie = DNS + TCP/TLS + TTFB (serwer/pochodzenie/pamięć podręczna) + dostarczanie treści (RTT × woluminy) + render klienta.
Optymalizacja = zmniejszenie liczby RTT, zmniejszenie bajtów i przesunięcie obliczeń/pamięci podręcznej bliżej użytkownika.
2) Architektura CDN
Anycast POP jest bliskim końcem węzła routingu BGP.
Warstwowe buforowanie/tarcza pochodzenia - warstwa pośrednia „parasol”, która zmniejsza burzę na pochodzenie.
Trasa geo-/regionalna - powiązanie najemcy/jurysdykcji (suwerenność danych, licencje).
Awaria - kopia zapasowa pochodzenia/regionu, próbki zdrowia i szybki przełącznik.
3) Pamięć podręczna: klucze, nagłówki, strategie
3. 1 klucze pamięci podręcznej
Domyślnie jest 'schemat + host + ścieżka +? zapytanie '.
Dodaj tylko parametry, które chcesz ('? v = ','? lang = ','? najemca = '). Reszta jest ignorowana.
'Vary' - minimalne: 'Accept-Encoding', 'Accept-Language' (w razie potrzeby), 'Authorization' zwykle łamie pamięć podręczną.
3. 2 Polityka
Statyki publiczne: „Cache-Control: public, max-age = 31536000, immutable” + rev (hash w nazwie).
Pół-dynamika (katalogi, zasady, FAQ): 's-maxage = 300, stale-while-revalidate = 600, stale-if-error = 86400'.
API-GET: użyj ETag/Last-Modified, 'SWR/SIE', włącz koalescencję (jedno żądanie dla gorącego klucza).
Prywatne: odpowiedzi osobiste - na obwodzie za pomocą krawędzi obliczeniowej (ESI/kv) lub pamięci podręcznej na lokatora.
3. 3 Anty-burza
Żądanie koalescingu - załamać jednoczesne błędne wnioski.
Serv- stale - podaj przestarzały obiekt, gdy pochodzenie nie powiodło się.
Przedłużenie ważności tła - aktualizacja w tle.
4) HTTP/2-3, TCP/TLS i wczesny powrót
HTTP/2: multipleks, kompresja nagłówka; limit 'max współistniejących strumieni', duże nagłówki.
HTTP/3 (QUIC): znaczny spadek TTFB mobilnego/wysokiej straty; mieć oko na Initial-rapids i Retry.
TLS 1. 3: 1-RTT uścisk dłoni; zszywanie OCSP; HSTS.
0-RTT: tylko dla idempotent 'GET' i jeśli rozważa się powtórzenie ryzyka.
103 Wczesne wskazówki: Wczesne 'Link: rel = preload' dla zasobów krytycznych.
Preconnect/DNS-prefetch: '<link rel = "preconnect" href = "https ://cdn. przykład">'.
5) Obliczanie krawędzi i „drobna personalizacja”
Na krawędzi: spis tytułów, utrwalenie geo/lokatora, oznaczenie A/B, łatwa personalizacja bez żądania pochodzenia.
Zasada: nie przechowywać PII w węzłach POP; agregaty pamięci podręcznej/dane publiczne.
6) Optymalizacja nośników i formatów
Obrazy: automatyczna konwersja do WebP/AVIF, rozmiar na krawędzi, 'srcset/sizes',' lazyload '.
Kompresja: Brotli dla tekstów (HTML/CSS/JS/JSON), gzip fallback.
Wideo: HLS/DASH, buforowanie segmentu CDN, 'preload = metadane', plakat.
Czcionki: subet + 'font-display: swap'; gospodarz z z długim pamięcią podręczną.
Krytyczny CSS: inline pierwszy ekran; Reszta to async.
7) wzory i buforowanie API
Idempotent GET - buforujemy za pomocą kluczy żądania (w tym wersji danych).
ETag: Mocne hash ładunku + 'If-None-Match'.
Sterowanie zastępcze (specyficzne dla CDN) w celu odróżnienia od klienta 'Cache-Control'.
Podpisane adresy URL - dla prywatnych środków statycznych/mediów.
GraphQL: normalizacja pamięci podręcznej klucza przez działanie/zmienne; używać pamięci podręcznej/rozdzielczej.
WebSockets: dla czasu rzeczywistego - skrócenie wiadomości, kompresja (permessage-deflate), położenie WS-shards bliżej użytkownika.
8) Przykłady konfiguracji
8. 1 NGINX (pochodzenie: przechowujemy 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 Szybko VCL (SWR, koalescencja, ignorowanie plików cookie)
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 (Przepisy transformacji, Zasady Cache, 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) Sieci komórkowe i „niestabilny” Internet
Użyj HTTP/3 agresywnie; zmniejszyć rozmiar ścieżki krytycznej (HTML + krytyczny CSS <14 KB).
Priorytet H2/H3: Priorytet (HTML → CSS → JS → media później).
Polityka retray z jitter, idempotencja dla API.
Budżet wielkości i pakiet: podział kodów, odroczony JS, usunięcie niewykorzystanych CSS/JS.
10) Obserwowalność i SLO
RUM: TTFB, LCP, INP, CLS według regionu/ASN/najemców; p95/p99 dystrybucje.
Syntetyka: droga kontrolna "/zdrowie/cdn' przez POP-s.
Mierniki pamięci podręcznej: współczynnik trafienia ogółem i na klucz; wskaźnik pochodzenia; oszczędności koalescencji.
Alerty: spadek współczynnika trafienia, wzrost pochodzenia-wyjścia, degradacja H3-fraction, 5xx na tarczę.
11) Szczegóły dotyczące iGaming/Finance
Katalogi/kursy gier: short 's-maxage' + SWR; region-aware кла („najemca 'region' lang”).
Szczyty wydarzeń (mecze, rysunki): ocieplenie pamięci podręcznej (przed-ciepłe), „zamrażanie” ciężkich personalizacji, źródła lustrzane.
Płatność/szafka: nie przechowywać prywatnie, ale przyspieszyć przez H3 + krawędzi-TLS i zamknąć region.
Jurysdykcje: podzielone domeny/ścieżki na poszczególne regiony; "Różnica: X-Region 'control.
12) Antypattery
„Różni się:” na wszystko; klucz pamięci podręcznej zależy od zbędnych plików cookie/nagłówków.
Brak SWR/SIE → czarne ekrany dla awarii krótkiego pochodzenia.
Wyczyść pamięć podręczną „wszędzie” zamiast wskazywać niepełnosprawność za pomocą znaczników/kluczy.
Zasoby bez zmiany nazwy i z 'max-age = 0'.
Globalna odmowa pamięci podręcznej dla 'Autoryzacji' nawet tam, gdzie podaje się opinię publiczną.
Brak koalescencji → burza na pochodzenie.
Przedwczesna „ciężka” personalizacja na POP.
13) Lista kontrolna gotowości Prod
- Anycast POP + wielopoziomowy/tarcza; kontrole zdrowotne i awaria pochodzenia.
- Klucze pamięci podręcznej są minimalne; ignorowanie niepotrzebnych zapytań/plików cookie; „Kontrola zastępcza”.
- SWR/SIE włączone, koalescencji aktywne; serving-stale na błędach.
- HTTP/3 włączone; TLS 1. 3; 103 Wczesne wskazówki są skonfigurowane dla zasobów krytycznych.
- Obrazy: AVIF/WebP, rozmiar na krawędzi; Brotli do tekstów.
- API-GET ETag/Last-Modified; idempotencja/rekolekcje; nie buforować profili prywatnych.
- Preconnect do domen statycznych; krytyczny CSS inline.
- Wskaźniki: wskaźnik trafienia, pochodzenie-wyjście, TTFB/LCP p95, H3-share, według regionu/najemcy.
- Plan nagrzewania pamięci podręcznej przed wydarzeniami; niepełnosprawność punktowa (tagi).
- Zmienne/klucze/dokumentacja TTL; odtwarzanie incydentów (spadek współczynnika trafienia).
14) TL; DR
Utrzymuj wędrówkę do źródła do minimum: wielopoziomowy/tarcza + odpowiednie cache-keys + SWR/SIE + koalescencji. Włącz HTTP/3/TLS 1. 3, użyj 103 wczesnych wskazówek i preconnect. Kompresja i konwersja nośników na krawędzi, inline krytyczny CSS. Dla API - ETag, schludne 'Vary', idempotencja i rozsądne buforowanie 'GET'. Zmierz współczynnik trafienia, TTFB/LCP p95, wyjście pochodzenia i rozgrzać pamięć podręczną z wyprzedzeniem w szczytach.