חישובי CDN ו ־ TTL
תקציר
מטמון CDN הוא ”מגן + מאיץ” בין המשתמש למקור. זה עובד טוב כאשר:1. מפתח המטמון יציב ולא מכיל ”רעש”.
2. מדיניות TTL תחת עומס: ”S-maxage ”/” max-age” + ”stale-with-explace/if-aview”.
3. נכות מנוהלת: על ידי תגיות/קדימות + טיהור ”רך”.
4. מטמון-מטמון/מגן-מוצא ומטמון שלילי כלולים.
5. ישנה יכולת תצפית: יחס פגיעה בשכבות, p95 TFB, נתח חזרה 304.
כותרות בסיס ומה הם מתכוונים
”מטמון-שליטה”:- 'max-age =
' - TTL לדפדפן. - מקס =
'- TTL עבור CDN/proxy (חפיפה' max-age '). - ”מעופש בזמן-לבטל =
” - לתת את מיושן, עדכון במקביל. - 'מעופש-אם-טעות' <'s> '- אנחנו חוזרים אחד מיושן כאשר טעות המקור מתרחשת.
- ”בלתי ניתן לשינוי” - המשאב אינו משתנה (מתאים לנכסים ממולאים).
- 'ETag '/' Last-Modified' - תנאים עבור 304, לשמור בייטים/מקור מעבד.
- ”שונה” - רשימה של כותרות שמשפיעות על מפתח המטמון (שימוש באיפוק!).
- 'פונדקאית-בקרה' - ”מורחבת” מטמון-בקרה עבור CDN (אם נתמכת).
- ”פג תוקף” - מיושן, אבל עדיין מטופל על ידי לקוחות.
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: מקרה, חתכים כפולים, לוכד נגרר, סדר של פרמטרים שאילתה.
התעלם מ "רעש": "אום _'," fbclid', "gclid', תגי שופט שרירותיים.
Limited vary: רק כותרות משמעותיות (”קבלה-קידוד”, לפעמים ”קבל”, ”קבל-שפה” עבור locale).
התקן-class: אם יש צורך, השתמש ב ־ 2-3 מחלקות (ניידת/שולחן עבודה/טאבלט), ולא אינסוף סניפים של סוכן משתמש.
הקשר Auth: לא מטמון פרטי כברירת מחדל; שימוש בכתובות חתומות/עוגיות-מעקף או נתיבים ציבוריים/פרטיים נפרדים.
Surrogate-Key: product:123 catalog
Cache-Control: public, s-maxage=300, stale-while-revalidate=600
Vary: Accept-Encoding
אסטרטגיות TTL לפי סוג תוכן
מדיניות נכות
על ידי URL/Prefix: ”לטאטא הכל תחת '/סטטי/2025-11-05/”.
על ידי תגית/מפתח: ”הסר את כל 'קטלוג' ו 'מוצר: 123'”.
טיהור רך: סמן כמיושן, אל תמחק את האובייקט - מילוי מהיר יותר.
מונע אירועים: CI/CD או Odmin אירוע מפעיל webhook ”תגיות חסרות תוקף”.
המלצה: לשלב את שתי הטקטיקות: הסבת נתיבים עבור נכסים + תג-טיהור עבור תוכן/עמודים.
tiered-cache, מקור-מגן preprewm
שכבות אזוריות CDN = פחות בקשות מקור.
מגן המקור: ”מגן” אחד פופ למקור - משפר את המקום והיחס להיט.
PREWARM (קדם הבאה): לחמם כתובות/מטמונים חמים לפני אירוע/שחרור.
מטמון שלילי: מטמון 5xx/Timeout לזמן קצר (30-120 ש "ח) כדי לא להכריע את המוצא עם סופת רטראס.
כאשר אתה יכול
רק גט/ראש ואידימפוטנט.
מפתח: מסלול + שאילתות חיוניות (לדוגמה, '? קטגוריה = & page = "...).
אימות: 'ETag '/' Last-Modified' ו- 'short' s-maxage '.
מסננים על ידי משתמש: להביא התאמה אישית לפונקציית הלקוח/קצה או להשתמש בתגובה חתומה + ”ציבורית”.
Cache-Control: public, s-maxage=30, max-age=5, stale-while-revalidate=120, stale-if-error=600
ETag: "feed-v42"
מטמון הרעלת הגנה
נורמליזציה של URL/כותרת קשה; לבן של פרמטרים במפתח.
חיתוך כותרות חשודות/שכפולים (”X-Forwarded”, מורחב ”קבל”).
הגבלת ”Vary” ולשלוט בגודל/מספר הכותרות.
הפרדת דומיין: פרטי/מנהל - בשם נפרד ללא מטמון.
אימות תגובות: אל תטמון 4xx (למעט 404 עבור סטטי), אל תטמון דפי משתמש ללא מדיניות מפורשת.
דחיסה ופורמטים
ברוטלי לטקסט (js/css/json), gzip - fallback; נכסים דחוסים מקובלים.
תמונות: webp/avif שבו תמיכה; השתמש ב- vary: קבל "+ נגזרות.
טווח בקשות לווידאו/אודיו: CDN caches chunks.
תוכן-משא ומתן: שמור את הקרדינליות של המפתח נמוכה (מכשיר-מחלקה במקום UAs גולמי).
תצפית ו SLO
מטריצות מפתח
Hit-ratio (על ידי בייטים/בקשות) heartheend/tier/shield.
P50/95/99 TFB לפי אזור וסוג (סטטי/API).
יציאת מלוא קצב/מקורות - כמה הולך למקור.
שיעור 304 וגודל תגובה ממוצע.
תקציב שגיאה: שיתוף של בעיות ”מעופש-אם-שגיאה ”/” SWR”; תדר הטיהור.
דוגמאות SLO
'P95 TFBstatics באופן זמני 120-150 ms, API GET Cared 200-250 ms.
אדג 'פגע ביחס סטטי 90%, חצי רמקולים 60%.
אחוז התגובות מהענף המעופש עם שגיאות הקיימות ב-0. 5% בימים 30.
גיליונות רמאות קונפיג
Nginx (הפוך-פרוקסי לפני CDN או ב-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;
}
}
שליח (SWR + שלילי-מטמון, קונספט)
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
איך מזומנים חוסכים כסף
Egress Origin, פחות CPU/DB Loame # עלויות תשתית נמוכות יותר.
פחות בקשות לתשלום (חיפוש/אינדקס/תמונות).
יעד מטרי: $/ירידה ב-p95 ו-$/ירידה ביציאה ב-1 GB - לעקוב אחר אפקט שלאחר השיגור.
iGaming/fintech ספציפי
קטלוגים/נכסים של ספקים: מסלולים מבוססים + TTL שנתי.
נחיתת אירוע/טורניר: 1-5 min 's-maxage' + 'SWR' עבור 10-30 דקות; טיהור-תג על שדרוג.
עמודי LIV (מקדמים/טבלאות): מטמון חלקי של בלוקים JSON, TTL קצר (5-30 s), עבור בלוקים אישיים - הפקת לקוח.
נקודות קצה של התשלום: אל תטמון, 'אין חנות' קפדנית; ספרי עיון בלבד (שולחנות סל, סטטוסים).
אנטיוט: static/GET Capting, מסלולים אפורים עבור ASNs חשוד; שמור 'Vary' מתוך כותרות רועשות.
רשימת יישומים
[ מפתח מטמון ] תיאר: נורמליזציה כתובות, רשימה של שאילתות מותרות, 'Vary' רק עבור הרצוי.
[ ] נתיבים ציבוריים/פרטיים מופרדים; פרטי - 'אין חנות' ולעקוף CDN.
[ ] סולמות TTL לפי סוג התוכן שהוצג; הגדרת SWR/אם-טעות.
[ ] מטמון-מטמון + מגן מקור; מטמון שלילי 5xx (קצר) מופעל.
[ ] קיים טיהור תג/כתובת, טיהור רך; אינטגרציה עם CI/CD.
[ ] כולל דחיסה (br/gzip), תבניות תמונות רשת ותגובות לטווח.
[ ] Metrics: פגיעה ביחס שכבה, P95 TFB, קצב 304, יציאת מוצא; התראות לכישלונות.
[ ] ספרי משחקים: חימום מטמון לפני פסגות, טיהור חירום, הידרדרות המקור.
שגיאות נפוצות
non-versio נכסים עם TTL גדול = ”דביק” חבילות ממשתמשים.
”Vary” (על ידי ”User-Agent”, כל הכותרות) = פיצוץ של קרדינליות ויחס להיט נמוך.
מזמין 4xx/401/403/תוכן פרטי.
מחסור במטמון שלילי = מפולת של בקשות למקור מושפל.
אין טיהור-תג = ניקוד מסיבי טיהור וסערה מחדש למלא.
מפתח המטמון כולל פרמטרים ”רועשים” UTM/Ref.
TTL קצר מדי עבור סטטיקה = עומס נוסף על CDN ומקורו.
ספרי משחקים מיני
1) לחמם את המטמון לפני האירוע
1. איסוף כתובות Top-N על ידי logs # 2) prefetch מקבילית (קצב מוגבל) על ידי region-limited # 3) בדוק את היחס להיט ו-p95.
2) קטולוגים רכים לטיהור חירום
1. שלח ”טיהור ”/tag-clear = 2) CDN נותן מעופש ומושך את טרי עם הרקע = 3) בדוק אין קוצים במקור.
3) כשל במקור
1. 'מעופש-אם-טעות' עוזר X שעות # 2) אפשר לבאנר ”עבודה טכנית” על הקצה # 3) עם התאוששות - חימום המטרה.
תוצאות
אסטרטגיית CDN חזקה = מפתח מטמון נכון + TTL בעל משמעות עם SWR/if-שגיאה + מנוהלת נכות + מוגבלת/מגן + תצפית. לתקן את המדיניות בכותרות ו-IC, למדוד את יחס הפגיעות ו-p95, לתכנן להתחמם לשיאים - והמשתמשים תמיד יקבלו תשובה מהירה, והמקור יישאר בחיים אפילו בשעה החמה ביותר.