GH GambleHub

CDN緩存和TTL優化

簡短摘要

CDN-kesh是用戶與起源之間的「加速器+屏蔽」。當:

1.緩存密鑰(緩存密鑰)是穩定的,不包含「噪音」。

2.負荷下的TTL政策:'s-maxage'/'max-age'+'stale-wile-revalidate/if-error'。

3.殘疾管理:按標簽/前綴+「軟」purge。

4.包括tiered-cache/origin-shield和negative-cache。

5.有可觀察性:按層排序,p95 TTFB,回報比例304。

基本頭以及它們的含義

`Cache-Control`:

"max-age=<s>'-瀏覽器的TTL。
's-maxage=<s>'-CDN/代理的 TTL(重疊'max-age')。
「stale-while-revalidate=<s>」-我們放棄過時,我們並行更新。
"stale-if-error=<s>'-我們給出過時的起源錯誤。
「immutable」-資源不會改變(適合於固定的推理)。
「ETag」/「Last-Modified」-304的條件,節省字節/CPU起源。
「Vary」是影響緩存密鑰的標題列表(使用約束!)。
「Surrogate-Control」是用於CDN的「高級」緩存控制(如果支持)。
「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歸一化:寄存器,雙斜線,預告片,查詢參數順序。
忽略「噪音」:「utm_」,「fbclid」,「gclid」和任意裁判標簽。
限量版:只有真正重要的標題(「接受編碼」,有時是「接受」,「接受語言」用於本地化)。
設備類:如果需要,請使用2-3類(移動/desktop/tablet),而不是分支的無限用戶代理。
Auth上下文:默認情況下,不要取消私有;使用signed-URLs/cookies-bypass或公共/私人路徑分離。

Fastly風格(偽式):

Surrogate-Key: product:123 catalog
Cache-Control: public, s-maxage=300, stale-while-revalidate=600
Vary: Accept-Encoding

跨內容類型的TTL策略

類型TTL CDN (`s-maxage`)瀏覽器(「最大時代」)另外,
反向刺客('/app。a1b2.js`)1年1年`immutable`;不需要殘疾
目錄/登陸1-10分鐘30-120 c`stale-while-revalidate=10–30 мин`
圖像(重新設計)10-60分鐘5-15分鐘Vary по `Accept` (webp/avif)
GET API(可緩存)10-120 c0-30 s只有偶數;「stale-if-error」 5-60分鐘
500/timeout錯誤00Negative-cache 30-120 with(在CDN級別),不緩存401/403/POST

殘疾政策

通過URL/Prefix: 「把一切都轉移到'/static/2025-11-05/'下。」

By Tag/Key:"刪除整個'catalog'和'product: 123'。
Soft purge:標記為過時,不要擦除對象-更快地重新填充。
事件驅動程序:CI/CD或管理事件調用webhook「入侵標簽」。

建議:將兩種策略結合起來:為內容/頁面提供+標簽支架的路徑。

Tiered-cache, origin-shield и prewarm

Tiered-cache:區域CDN層對起源的查詢→少。
Origin-shield:一個「盾牌」POP to origin-提高了位置和命中率。
Prewarm (pre-fetch): 在活動/發布之前加熱熱URL/緩存。
Negative-cache:短暫地5xx/Timeout(30-120 s),以免被暴風雨的後退淹沒。

Kesh API: 什麼時候可以

只有GET/HEAD和偶數。
關鍵:路徑+基本查詢(例如'?category=……&page=……')。
驗證:「ETag」/「Last-Modified」和簡短的「s-maxage」。
用戶過濾器:對客戶端/邊緣功能進行個性化處理或使用簽名請求+「公開」響應。

示例(API, 30 with+SWR):

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-」,擴展的「接受」)。
限制「Vary」並控制標題的大小/數量。
分域:私有/管理員-在沒有緩存的單獨名稱上。
驗證響應:不緩存4xx(靜態除外404),不緩存「自定義」頁面沒有顯式策略。

壓縮和格式

文本的Brotli(js/css/json),gzip-fallback;預壓縮asset是允許的。
圖片:支持的webp/avif;使用「Vary: Accept」+衍生產品。
視頻/音頻的範圍請求:CDN緩存錢幣。
Content-Negotation:保持低鍵基數(設備類而不是原始UA)。

可觀察性和SLO

關鍵指標

Hit-ratio (by bytes/requests) на edge/tier/shield.

p50/95/99按區域和類型(靜態/APIs)分列的TTFB。
Fill-rate/Origin egress-有多少人離開了起源。
304 rate和平均響應大小。
錯誤預算:「stale-if-error」/「SWR」發行的一部分;purge頻率。

SLO示例

「p95 TTFB」靜力學在區域上≤ 120-150毫秒,可加權的API ≤ 200-250毫秒。
Edge hit-ratio靜態≥ 90%,半動態≥ 60%。
錯誤時來自樣式分支的響應比例≤ 0。在30天內達到5%。

Config Spargalks

Nginx(在CDN之前或在self-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;
}
}

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

用於「快速」assets的頭部


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起源↓,CPU/DB負載較少→基礎架構成本較低。
有償後端(search/index/images)的查詢較少。
目標指標:$/減少p95和$/egress減少1 GB-跟蹤後期效果。

iGaming/fintech的細節

提供商/代理目錄:轉售路徑+年度TTL。
賽事/錦標賽登陸:10-30分鐘的1-5分鐘「s-maxage」+「SWR」;升級時的標簽購買。
Live Page(系數/表):部分JSON塊緩存,短TTL (5-30 s),對於個人塊-客戶端渲染。
PSP/支付端口:不打包,嚴格的「無商店」;僅緩存參考書(BIN表、狀態)。
Antibot:靜態/GET緩存,可疑的ASN的「灰色」路線;不要在嘈雜的標題上允許「Vary」。

實施支票

  • 描述了緩存密鑰:URL歸一化、允許查詢列表、「Vary」僅按所需設置。
  • 公共道路/私人道路是分開的;私有-「no-store」和旁路CDN。
  • 按內容類型介紹了TTL梯子;設置為「SWR/if-error」。
  • 配置了tiered-cache+origin-shield;包括negative-cache 5xx(短)。
  • 有tag/URL purge, soft purge;與CI/CD集成。
  • 啟用了壓縮(br/gzip)、Web圖像格式和範圍響應。
  • 度量標準:按層排列的hit-ratio,p95 TTFB,304 rate,origin egress;失誤。
  • 花花公子:在峰值前加熱緩存,緊急沖浪,降解起源。

典型錯誤

大型TTL的無凡爾賽assets在用戶中→「紮根」的幫派。
過度的「Vary」(通過「User-Agent」,所有標題)→基數爆炸和低命中率。
4 x/401/403/私有內容緩存。
缺少negative-cache →降級起源請求的雪崩。
沒有標記陷阱→質量點陷阱和re-fill的「風暴」。
緩存密鑰包括「嘈雜」UTM/ref參數。
對於靜電而言,TTL太短,→對CDN和起源施加額外的負載。

迷你花花公子

1)在事件發生前預熱緩存

1.按邏輯收集前N URL → 2)按區域分列並行預覽(rate-limited) → 3)檢查最高↑和p95 ↓。

2)緊急軟沖刺陰道學家

1.發送「PURGE」/tag-c → lear 2) CDN給出樣式,背景拉起新鮮的→ 3)檢查起源上沒有尖峰。

3)原產地拒絕

1. 「stale-if-error」指定X時鐘 2)在Edge 3上打開「techrobs」橫幅)通過恢復-目標扭曲。

結果

強大的CDN策略=正確的緩存密鑰+具有SWR/if-error+受控殘疾+tiered/shield+可觀察性的有意義的TTL。在heders和IaC中記錄策略,測量熱值和p95,計劃在峰值下加熱-用戶總是會得到快速響應,即使是最熱的時刻,起源也會保持活著。

Contact

與我們聯繫

如有任何問題或支援需求,歡迎隨時聯絡我們。我們隨時樂意提供協助!

Telegram
@Gamble_GC
開始整合

Email 為 必填。Telegram 或 WhatsApp 為 選填

您的姓名 選填
Email 選填
主旨 選填
訊息內容 選填
Telegram 選填
@
若您填寫 Telegram,我們將在 Email 之外,同步於 Telegram 回覆您。
WhatsApp 選填
格式:國碼 + 電話號碼(例如:+886XXXXXXXXX)。

按下此按鈕即表示您同意我們處理您的資料。