مسائل رایج کش
سه بحران کش: Stampede (هجوم)، Penetration (نفوذ) و Avalanche (بهمن) — تشخیص و راهحلهای عملی
کش هم بحران دارد!
کش راهحل است اما سه سناریوی فاجعه دارد که هر مهندس ارشد باید بشناسد:
۱. Cache Stampede (هجوم)
سناریو: کلید پرطرفداری منقضی میشود → ۱۰٬۰۰۰ درخواست همزمان miss → همه به دیتابیس حمله! → دیتابیس میمیرد → بازیابی نمیشود (حتی کش پر شد، درخواستهای جدید میآیند)
راهحلها:
- Request Coalescing: فقط یک درخواست به DB برود؛ بقیه منتظر همان
- TTL با jitter: انقضاها را تصادفی پخش کن (همزمان منقضی نشوند!)
- Early Refresh: قبل از انقضا، در پسزمینه تازه کن
- Lock: اولین miss قفل بگیرد؛ بقیه صبر یا stale بگیرند
۲. Cache Penetration (نفوذ)
سناریو: درخواستهای کلید غیرموجود (user:999999) → همیشه miss → همیشه DB → کش بیفایده + DB زیر بار
حمله عمدی: DDoS با کلیدهای ساختگی!
راهحلها:
- کش مقدار خالی: کلید ناموجود را با NULL و TTL کوتاه کش کن
- Bloom Filter: قبل از کش چک: «قطعاً وجود ندارد؟» → رد فوری!
۳. Cache Avalanche (بهمن)
سناریو: همه کلیدها همزمان منقضی (یا کل سرور کش ریاستارت!) → سیل به DB
مثل Stampede اما در مقیاس کل کش!
راهحلها:
- TTL تصادفی: انقضا را در بازه پخش کن
- کش چندلایه: محلی + Redis (اگر یکی رفت، دیگری نجات میدهد)
- Hot standby: کش پشتیبان گرم
- Rate Limit روی DB: حتی در فاجعه، DB زنده بماند
جدول جمعبندی
| بحران | علت | راهحل کلیدی |
|---|---|---|
| Stampede | کلید داغ منقضی | Lock/Coalescing + jitter |
| Penetration | کلید ناموجود | کش NULL + Bloom Filter |
| Avalanche | انقضای گروهی/ریاستارت | TTL پخششده + چندلایه |
هشدار: این سه بحران در «پیک ترافیک» رخ میدهند — یعنی دقیقاً بدترین زمان ممکن! پیشگیری (TTL jitter، lock) را از روز اول بگذارید، نه بعد از اولین حادثه.
جمعبندی
- Stampede: هجوم به DB بعد از انقضای کلید داغ
- Penetration: کلید ناموجود = کش بیاثر
- Avalanche: سقوط گروهی کش
- پادزهر: jitter، lock، NULL cache، چندلایه
این مبحث بخشی از دوره آموزش کامل طراحی سیستم (System Design) است.