CDN кэштеу және TTL оңтайландыру
Қысқаша түйіндеме
CDN кэші - пайдаланушы мен origin арасындағы «жылдамдатқыш + қалқан». Ол жақсы жұмыс істейді, егер:1. Кэш кілті (cache key) тұрақты және құрамында «шу» жоқ.
2. Жүктеме бойынша TTL-саясат: 's-maxage '/' max-age' + 'stale-while-revalidate/if-error'.
3. Мүгедектік: тегтер/префикстер + «жұмсақ» purge бойынша басқарылады.
4. tiered-cache/origin-shield және negative-cache қосылған.
5. Бақылау бар: қабаттар бойынша hit-ratio, p95 TTFB, қайтарымдар үлесі 304.
Негізгі хедерлер және олар не білдіреді
`Cache-Control`:- 'max-age =
' - шолғыш үшін TTL. - 's-maxage =
' - CDN/прокси үшін TTL ('max-age' жабады). - 'stale-while-revalidate =
' - ескіргенін қайтарамыз, қатар жаңартамыз. - 'stale-if-error =
' - origin қатесі кезінде ескірген. - 'immutable' - ресурс өзгермейді (нұсқаланған ассеттер үшін жарамды).
- 'ETag '/' Last-Modified' - 304 үшін шарттар, байттарды/CPU origin үнемдейді.
- 'Vary' - кэш кілтіне әсер ететін тақырыптар тізімі.
- 'Surrogate-Control' - CDN үшін «кеңейтілген» Cache-Control (егер қолданылса).
- 'Expires' - ескірген, бірақ әлі де клиенттер есепке алады.
Cache-Control: public, max-age=31536000, immutable
Мысал (қауіпсіз ескірген жартылай динамика):
Cache-Control: public, s-maxage=300, max-age=60, stale-while-revalidate=600, stale-if-error=86400
ETag: "a1c3..."
Кэш кілті: дизайн және қалыпқа келтіру
Мақсат - мәні жағынан бірдей сұраулар бір нысанға түсуі.
URL қалыпқа келтіру: тіркелім, қосарлы слэштер, трейлинг-слэш, query-параметрлер тәртібі.
«Шу» белгісі: 'utm _', 'fbclid', 'gclid', ерікті реф-тегтер.
Шектеулі Vary: тек нақты мәнді тақырыптар ('Accept-Encoding', кейде 'Accept', 'Accept-Language' жергілікті үшін).
Device-class: қажет болса, шексіз user-agent тармақтарын емес, 2-3 сыныпты (mobile/desktop/tablet) пайдаланыңыз.
Auth-контекст: әдепкі бойынша жекеменшікті кешіктірмеңіз; signed-URLs/cookies-bypass немесе жария/жеке жолдарды бөлуді пайдаланыңыз.
Surrogate-Key: product:123 catalog
Cache-Control: public, s-maxage=300, stale-while-revalidate=600
Vary: Accept-Encoding
Мазмұн түрлері бойынша TTL-стратегиялар
Мүгедектік саясаты
By URL/Prefix: «бәрін '/static/2025-11-05/' астында ығыстыру».
By Tag/Key: «барлық 'catalog' және 'product: 123' алып тастау».
Soft purge: ескірген деп белгілеу, нысанды өшірмеу - тез қайта толтыру.
Event-driven: CI/CD немесе әкімшілік оқиғасы webhook «invalidate tags» деп аталады.
Ұсыным: екі тактиканы біріктіріңіз: ассеталар үшін жолдарды нұсқалау + мазмұн/беттер үшін tag-purge.
Tiered-cache, origin-shield и prewarm
Tiered-cache: CDN → аймақтық қабаттары origin сұрауларынан аз.
Origin-shield: бір «қалқанды» POP к origin - жергілікті және hit-ratio жақсартады.
Prewarm (pre-fetch): ивент/релиз алдында ыстық URL/кэштерді жылыту.
Negative-cache: 5xx/Timeout (30-120 с) қысқа уақыт кешіктіріңіз.
API кэші: мүмкін болғанда
Тек GET/HEAD және демпотентті.
Кілт: жол + маңызды query (мысалы, '? category =... & page =...').
Валидация: 'ETag '/' Last-Modified' және қысқа 's-maxage'.
Пайдаланушы сүзгілері: клиентке/edge функциясына дербестендіруді енгізіңіз немесе signed-requests + «көпшілік» жауабын пайдаланыңыз.
Cache-Control: public, s-maxage=30, max-age=5, stale-while-revalidate=120, stale-if-error=600
ETag: "feed-v42"
Кэштің улануынан қорғау (cache poisoning)
URL/тақырыптарды қатаң қалыпқа келтіру; кілттегі параметрлердің ақ тізімі.
Күмәнді тақырыптарды/қайталауларды кесу ('X-Forwarded-', кеңейтілген 'Accept').
'Vary' шектеуі және тақырыптардың өлшемін/санын бақылау.
Домендерді бөлу: жеке/әкімші - кэшсіз жеке атауда.
Жауаптарды валидациялау: 4xx кэштемеңіз (статиктер үшін 404-тен басқа), анық саясатсыз «пайдаланушы» беттерін кэштемеңіз.
Қысу және пішімдер
Brotli (js/css/json), gzip - fallback; Алдын ала қысылған ассеттер жарамды.
Images: webp/avif қолдау көрсетілетін жерде; 'Vary: Accept' + туынды деривативтерін пайдаланыңыз.
Видео/аудио үшін Range-requests: CDN күбілерді кэштейді.
Content-Negotiation: кілттің төменгі кардиналдылығын сақтаңыз (шикі UA орнына device-class).
Бақылау және SLO
Негізгі метриктер
Hit-ratio (by bytes/requests) на edge/tier/shield.
Өңірлер және типтер бойынша p50/95/99 TTFB (статик/API).
Fill-rate/Origin egress - origin қанша кетеді.
304 rate және орташа жауап мөлшері.
Error budget: үлесі 'stale-if-error '/' SWR' берілімдер; purge жиілігі.
SLO мысалдары
'p95 TTFB' статикасы аймақтық ≤ 120-150 мс. API GET кешенделетін ≤ 200-250 мс.
Edge hit-ratio статикасы ≥ 90%, жартылай динамикасы ≥ 60%.
Қателер кезінде stale-тармақтан жауаптар үлесі ≤ 0. 30 күнде 5%.
Шпаргалка
Nginx (CDN алдында немесе self-PoP-де reverse-proxy)
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 + negative-cache, тұжырымдама)
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
«Жылдам» ассеталарға арналған хедерлер
Cache-Control: public, max-age=31536000, immutable
ETag: "hash"
Content-Encoding: br
Жартылай динамикаға арналған хедерлер (каталогтар)
Cache-Control: public, s-maxage=600, max-age=120, stale-while-revalidate=1800, stale-if-error=86400
Vary: Accept-Encoding, Accept
FinOps: кэш ақшаны қалай үнемдейді
Egress origin ↓, кем CPU/DB-жүктеме → төмен инфрақұрылымдық шығыстар.
Ақылы бэкендтерге дейін аз сұраулар (search/index/images).
Мақсатты метрика: $/p95 төмендеуі және $/egress 1 ГБ төмендеуі - іске қосылғаннан кейінгі әсерді қадағалаңыз.
iGaming/финтех ерекшелігі
Провайдерлер каталогтары/ассеттер: нұсқаланған жолдар + жылдық TTL.
Оқиғалар/турнирлер лендингі: 1-5 мин 's-maxage' + 'SWR' 10-30 мин; tag-purge жаңартылғанда.
Лив-беттер (коэффициенттер/кестелер): JSON-блоктардың ішінара кэші, қысқа TTL (5-30 с), дербес блоктар үшін - клиенттік рендер.
PSP/төлем эндпоинттері: кешірмейміз, қатаң 'no-store'; тек анықтамалықтарды кэштеңіз (BIN-кестелер, мәртебелер).
Антибот: статиктерді/GET кэштеу, күдікті ASN үшін «сұр» маршруттар; 'Vary' дегенді шулы тақырыптарда жібермеңіз.
Енгізу чек-парағы
- Кэш кілті сипатталған: URL қалыпқа келтіру, рұқсат етілген query тізімі, 'Vary' тек қажетті бойынша.
- Жария/жекеше жолдар бөлінген; жеке меншік - 'no-store' және bypass CDN.
- Мазмұн түрлері бойынша TTL-баспалдақтар енгізілді; 'SWR/if-error' баптаған.
- tiered-cache + origin-shield баптаулары; қосылған negative-cache 5xx (қысқа).
- tag/URL purge, soft purge бар; CI/CD біріктіру.
- Компрессия (br/gzip), веб-кескін пішімдері және range жауаптар қосылды.
- Өлшемдер: hit-ratio by layer, p95 TTFB, 304 rate, origin egress; құлдырау қаупі.
- Ойнатқыштар: шыңдар алдында кэшті жылыту, шұғыл purge, origin деградациясы.
Типтік қателер
Пайдаланушыларда үлкен TTL → «жабысқақ» бандласы бар нұсқасыз ассеттер.
Шамадан тыс 'Vary' ('User-Agent', барлық тақырыптар бойынша) → түбегейлі жарылыс және төмен hit-ratio.
4хх/401/403/жеке мазмұнды кэштеу.
negative-cache → тозған origin сұрауларының болмауы.
tag-purge → жаппай нүктелік purge және «шторм» re-fill жоқ.
Кэш кілті «шулы» UTM/реф параметрлерін қамтиды.
Статика үшін тым қысқа TTL → CDN және origin артық жүктеме.
Шағын ойнатқыштар
1) Оқиға алдында кэшті жылыту
1. Топ-N URL жинағы → 2) Өңірлер бойынша параллель prefetch (rate-limited) → 3) Тексеру hit-ratio ↑ және p95 ↓.
2) Шұғыл soft-purge катологтар
1. Жіберу 'PURGE '/tag-clear → 2) CDN stale береді және фоны жаңа тартады → 3) origin шип жоқ тексеру.
3) Бас тарту origin
1. 'stale-if-error' X сағат → 2) edge → 3) Қалпына келтіру бойынша - мақсатты warm-up баннерін қосу.
Жиынтық
Күшті CDN-стратегия = дұрыс кэш кілті + SWR/if-error + басқарылатын мүгедектігі + tiered/shield + бақылануы бар мағыналы TTL. Хедерлер мен IaC саясатын белгілеңіз, hit-ratio мен p95 өлшеңіз, шыңға жылынуды жоспарлаңыз - және пайдаланушылар әрқашан жылдам жауап алады, ал origin ең ыстық сағатта да тірі қалады.