ذخیره سازی CDN و بهینه سازی TTL
خلاصه ای کوتاه
یک حافظه CDN یک «شتاب دهنده + سپر» بین کاربر و مبدا است. به خوبی کار می کند زمانی که:1. کلید کش پایدار است و حاوی «سر و صدا» نیست.
2. سیاست TTL تحت بار: 's-maxage '/' max-age' + 'stale-while-escale/if-error'.
3. ناتوانی مدیریت می شود: توسط برچسب ها/پیشوندها + پاکسازی «نرم».
4. Tiered-cache/origin-shield و negative-cache را شامل می شود.
5. یک مشاهده پذیری وجود دارد: نسبت ضربه به لایه ها، p95 TTFB، سهم بازگشت 304.
سربرگ پایه و آنچه آنها به معنی
'کنترل کش':- 'max-age =
' - TTL برای مرورگر. - 's-maxage =
' - TTL برای CDN/پروکسی (همپوشانی 'max-age'). - 'stale-while-revalidate =
' - به صورت موازی بهروزرسانی میشود. - 'stale-if-error =
' - وقتی خطای مبدأ رخ می دهد، یکی از قدیمی ها را برمی گردانیم. - «تغییر ناپذیر» - منبع تغییر نمی کند (مناسب برای دارایی های نسخه شده).
- 'ETag '/' Last-Modified' - شرایط 304، ذخیره بایت/منشاء CPU.
- 'Vary' - لیستی از هدر هایی که بر کلید حافظه پنهان تاثیر می گذارد (با محدودیت استفاده کنید!).
- 'Surrogate-Control' - «extended» Cache-Control برای 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: مورد، دو اسلش، اسلش دنباله، سفارش پارامترهای پرس و جو.
چشم پوشی از "سر و صدا": "utm _'،" fbclid "،" gclid "، برچسب های مرجع دلخواه.
Vary محدود: فقط عناوین واقعا قابل توجه ('Accept-Encoding'، گاهی اوقات 'Accept'، 'Accept-Language' برای محلی).
کلاس دستگاه: در صورت لزوم، از 2-3 کلاس (موبایل/دسکتاپ/رایانه لوحی) استفاده کنید، نه شاخه های عامل کاربر بی پایان.
زمینه Auth: خصوصی را به طور پیش فرض ذخیره نکنید ؛ استفاده از امضا URL ها/کوکی ها-بای پس یا مسیرهای عمومی/خصوصی جداگانه.
Surrogate-Key: product:123 catalog
Cache-Control: public, s-maxage=300, stale-while-revalidate=600
Vary: Accept-Encoding
استراتژی های TTL بر اساس نوع محتوا
سیاست های معلولیت
با URL/Prefix: "همه چیز را در زیر "/static/2025-11-05/" جارو کنید.
توسط برچسب/کلید: «حذف تمام کاتالوگ» و «محصول: 123».
پاکسازی نرم: علامت به عنوان منسوخ، شی را پاک نکنید - سریع تر پر کردن.
رویداد محور: CI/CD یا رویداد مدیر فراخوانی webhook «برچسب نامعتبر است».
توصیه: ترکیب هر دو تاکتیک: مسیرهای نسخه برای دارایی + برچسب پاکسازی برای محتوا/صفحات.
چند لایه کش، منبع سپر и prewarm
Tiered-cache: لایه های منطقه ای CDN → درخواست های مبدا کمتر.
Origin-shield: یک POP «سپر» به مبدا - محل و نسبت ضربه را بهبود می بخشد.
Prewarm (pre-fetch): گرم کردن URL ها/کش های داغ قبل از رویداد/انتشار.
منفی کش: 5xx/Timeout کش برای یک زمان کوتاه (30-120 ثانیه) به طوری که به پایمال منشاء با یک طوفان از retras.
API کش: هنگامی که شما می توانید
فقط GET/HEAD و idemotent.
کلید: مسیر + نمایش داده شد ضروری (به عنوان مثال، '? category =... & page =... ').
اعتبار سنجی: «ETag »/« Last-Modified» و کوتاه «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'، گسترش 'Accept').
«Vary» را محدود کنید و اندازه/تعداد هدر ها را کنترل کنید.
جداسازی دامنه: خصوصی/مدیر - در یک نام جداگانه بدون کش.
اعتبار سنجی پاسخ ها: 4xx را ذخیره نکنید (به جز 404 برای استاتیک)، صفحات «کاربر» را بدون یک سیاست صریح ذخیره نکنید.
فشرده سازی و فرمت ها
Brotli برای متن (js/css/json)، gzip - برگشت ؛ دارایی های پیش فشرده قابل قبول هستند.
تصاویر: webp/avif که در آن پشتیبانی ؛ استفاده از 'Vary: Accept' + مشتقات.
محدوده درخواست برای ویدئو/صوتی: CDN قطعات را ذخیره می کند.
مذاکره محتوا: کاردینالیتی کلیدی را پایین نگه دارید (کلاس دستگاه به جای UA های خام).
معیارهای کلیدی
نسبت ضربه (با بایت/درخواست) на لبه/ردیف/سپر.
p50/95/99 TTFB بر اساس منطقه و نوع (استاتیک/API).
Fill-rate/Origin egress - چقدر به مبدا می رود.
نرخ 304 و اندازه پاسخ متوسط.
بودجه خطا: سهم مسائل «stale-if-error »/« SWR» ؛ فرکانس پاکسازی
نمونه های SLO
'p95 TTFB' استاتیک منطقه ای ≤ 120-150 میلی ثانیه، API GET ذخیره شده ≤ 200-250 میلی ثانیه.
استاتیک لبه ضربه نسبت ≥ 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
FinOps: چگونه پول نقد موجب صرفه جویی در پول
خروج از ↓ مبدا، بار CPU/DB کمتر → هزینه های زیرساخت پایین تر.
درخواست های کمتر به پشتیبان های پرداخت شده (جستجو/فهرست/تصاویر).
متریک هدف: $/کاهش در p95 و $/کاهش در خروج توسط 1 GB - پیگیری اثر پس از راه اندازی.
iGaming/fintech خاص
کاتالوگ ارائه دهنده/دارایی: مسیرهای نسخه + TTL سالانه.
فرود رویداد/مسابقات: 1-5 دقیقه 's-maxage' + 'SWR' برای 10-30 دقیقه ؛ برچسب پاکسازی در ارتقاء.
صفحات Liv (ضرایب/جداول): حافظه پنهان جزئی از بلوک های JSON، TTL کوتاه (5-30 s)، برای بلوک های شخصی - رندر مشتری.
PSP/endpoints پرداخت: کش نیست، سخت 'بدون فروشگاه' ؛ فقط کتابهای مرجع کش (جداول BIN، وضعیت).
Antibot: استاتیک/GET ذخیره سازی، مسیرهای خاکستری برای ASN های مشکوک ؛ نگه داشتن «متفاوت» از سرفصل های پر سر و صدا.
چک لیست پیاده سازی
- کلید کش شرح داده شده است: نرمال سازی URL، لیست نمایش داده شد مجاز، «Vary» فقط برای مورد مورد نظر.
- مسیرهای عمومی/خصوصی از هم جدا; خصوصی - «بدون فروشگاه» و دور زدن CDN.
- نردبان TTL توسط نوع محتوا معرفی ؛ 'SWR/if-error' را پیکربندی کنید.
- لایه کش + منبع سپر پیکربندی; منفی کش 5xx (کوتاه) را فعال کنید.
- پاک کردن برچسب/URL، پاکسازی نرم وجود دارد ؛ ادغام با CI/CD.
- شامل فشرده سازی (br/gzip)، فرمت های تصویری وب و پاسخ های محدوده.
- معیارها: نسبت ضربه به لایه، p95 TTFB، نرخ 304، خروج از مبدا ؛ هشدارهایی برای شکست ها
- Playbooks: کش گرم کردن قبل از قله، پاکسازی اضطراری، تخریب منشاء.
خطاهای رایج
دارایی های غیر ورسیو با TTL بزرگ → بسته های «چسبنده» از کاربران.
«Vary» بیش از حد (توسط «User-Agent»، همه هدر ها) → انفجار کاردینالیتی و نسبت کم ضربه.
ذخیره سازی 4xx/401/403/محتوای خصوصی.
فقدان منفی کش → بهمن از درخواست برای مبدا تنزل.
بدون برچسب پاکسازی → پاکسازی نقطه عظیم و طوفان دوباره پر کنید.
کلید حافظه پنهان شامل پارامترهای UTM/ref «پر سر و صدا» است.
TTL بیش از حد کوتاه برای استاتیک → بار اضافی در CDN و مبدا.
کتاب های مینی
1) گرم کردن کش قبل از رویداد
1. جمع آوری URL های top-N توسط سیاهههای مربوط → 2) پیش فرض موازی (نرخ محدود) توسط منطقه → 3) بررسی نسبت ضربه ↑ و ↓ p95.
2) Catologists نرم پاکسازی اضطراری
1. ارسال 'پاکسازی '/برچسب روشن → 2) CDN می دهد کهنه و می کشد تا تازه با پس زمینه → 3) برای هیچ خوشه در مبدا را بررسی کنید.
3) شکست منبع
1. «stale-if-error» به X ساعت کمک می کند → 2) بنر «کار فنی» را در لبه فعال کنید → 3) پس از بازیابی - گرم شدن هدف.
نتیجه گیری
استراتژی CDN قوی = کلید حافظه پنهان صحیح + TTL معنی دار با SWR/if-error + ناتوانی مدیریت شده + لایه ای/سپر + قابلیت مشاهده. رفع سیاست در هدر و IaC، اندازه گیری نسبت ضربه و p95، برنامه ریزی برای گرم کردن تا قله - و کاربران همیشه یک پاسخ سریع دریافت خواهید کرد، و منشاء حتی در داغترین ساعت زنده باقی خواهد ماند.