Cache Stampede یا هجوم همزمان به کش، زمانی رخ میدهد که کلید پرطرفداری منقضی شود و تعداد زیادی درخواست همزمان بخواهند مقدار آن را از منبع اصلی بسازند.
فرض کنید قیمت سبد خرید کمپین فروشگاه در کش نگهداری میشود. اگر هزار درخواست همزمان کش میس دریافت کنند، پایگاه داده با هزار محاسبه تکراری روبهرو میشود.
راهکارهای رایج
| راهکار | اثر | محدودیت |
|---|---|---|
| قفل هنگام بازسازی | فقط یک پردازش داده را میسازد | مدیریت خرابی و زمان انقضای قفل لازم است |
| TTL Jitter | زمان انقضای کلیدها را پراکنده میکند | به تنهایی هجوم به یک کلید را رفع نمیکند |
| Stale-While-Revalidate | موقتاً نسخه قدیمی را نشان میدهد و بازسازی میکند | برای قیمت قطعی یا موجودی حساس مناسب نیست |
| Request Coalescing | درخواستهای همزمان را به یک محاسبه وصل میکند | معمولاً داخل یک پروسس است |
نمونه در لاراول
$product = Cache::remember('product:42', now()->addMinutes(5), fn () => Product::findOrFail(42));
// For high traffic, protect regeneration with Cache::lock().
$lock = Cache::lock('lock:product:42', 10);
if ($lock->get()) {
try {
Cache::put('product:42', Product::findOrFail(42), 300);
} finally { $lock->release(); }
}
نکته فنی
قفل مانع پردازش تکراری میشود اما درخواستهای دیگر باید راهبرد انتظار، پاسخ جایگزین یا استفاده از نسخه کمی قدیمی داشته باشند. قفل توزیعشده به بکاند سازگار نیاز دارد.
اصطلاحات مرتبط: کشینگ، کش اینولیدیشن، ردیس، دیستریبیوتد لاک، ریت لیمیتینگ.
برای بررسی راهکارهای قفل کش، زمان انقضای تصادفی و بازسازی پیشدستانه، مقاله روشهای جلوگیری از Cache Stampede همراه با مثال در باورژن را مطالعه کنید.