Cache Stampede — bu bir vaqtning o'zida ko'plab mijozlar yoki oqimlarda kesh xatosi aniqlanganda ma'lumot manbaiga so'rovlarning sel shaklidagi o'sishidir. Mobil ilovalarda Cache Stampede mashhur kesh yozuvi muddati tugaganda va yuzlab qurilmalar bir vaqtning o'zida ma'lumotlarni qayta yuklashga urinib, serverning haddan tashqari yuklanishiga sabab bo'lganda yuz beradi. Medium Engineering (2024) tadqiqotiga ko'ra, Cache Stampede-dan to'g'ri sozlangan himoya serverning eng yuqori yukini 95% gacha kamaytiradi.
Asosiy Fikrlar
Cache Stampede (shuningdek cache thundering herd sifatida ham tanilgan) — bu ko'p sonli so'rovlar bir vaqtning o'zida kesh xatosini aniqlab, ma'lumot manbaiga yo'naltiriladigan holatdir. Bu tizimning degradatsiyasiga yoki to'liq ishdan chiqishiga olib kelishi mumkin bo'lgan eng yuqori yukni yaratadi.
Oddiy stsenariy: mobil ilova umumiy mahsulot ro'yxatini TTL = 5 daqiqa bilan keshlaydi. Soat 14:00 da kesh muddati tugaydi. 500 faol foydalanuvchi bir vaqtning o'zida katalogni ochadi, har biri bo'sh keshni aniqlaydi va barcha 500 so'rov serverga yuboriladi. Ma'lumotlar bazasi yoki tashqi API to'satdan oqimga dosh bera olmaydi, sahifa 10-15 soniya yuklanadi, so'rovlarning bir qismi timeoutga tushadi.
Vattani et al. (SOCC, 2015) ma'lumotlariga ko'ra, Cache Stampede muddati tugaydigan yozuvlarga ega har qanday keshlash qatlamida yuz beradi, jumladan CDN, Redis, Memcached, brauzerning HTTP-keshi va ilova xotirasidagi kesh. Yozuv qanchalik mashhur bo'lsa — stampede-dan potensial zarar shunchalik yuqori.
def mutex_get(key, lock_timeout=5):
cached = cache.get(key)
if cached is not None:
return cached
if lock.acquire(key, lock_timeout):
data = source.load(key)
cache.set(key, data)
lock.release(key)
return data
sleep(0.01)
return mutex_get(key, lock_timeout)
Ushbu misol mutex orqali himoyani ko'rsatadi: faqat birinchi oqim keshni yangilaydi, qolganlari tayyor natijani kutadi. Blokirovka mexanizmi — o'rtacha yuklar uchun stampede-ni oldini olishning eng sodda, ammo samarali usuli.
Ommaviy TTL muddatining tugashi — Cache Stampede-ning asosiy sababi. Mashhur kesh yozuvi barcha mijozlar uchun bir xil TTLga ega bo'lganda, ularning barchasi bir vaqtning o'zida uning yo'qligini aniqlaydi. Bu umumiy ma'lumotlar uchun xos: valyuta kurslari, mamlakatlar ro'yxati, ilovaning asosiy konfiguratsiyasi.
Serverni qayta ishga tushirishdagi kolaps — agar Redis yoki Memcached qayta o'rnatilsa, butun kesh bo'sh bo'ladi. Birinchi trafik eng yuqori nuqtasida barcha so'rovlar ma'lumotlar bazasiga ketadi. Amazon AWS Architecture Blog (2024) ma'lumotlariga ko'ra, qayta ishga tushirishdan keyin keshni isitish tavsiya etiladi: mashhur yozuvlarni asta-sekin yuklab, keskin yuk ko'tarilishining oldini olish.
Invalidatsiya mantiqidagi xato — dasturchi bir element o'zgarganda barcha foydalanuvchilar uchun keshni tozalaganda yuz beradi. Masalan, yangiliklar ilovasida bir maqola chop etilganda butun yangiliklar ro'yxati invalidatsiya qilinadi. Yuzlab foydalanuvchilar bir vaqtning o'zida bo'sh keshni aniqlaydi — va server qulab tushadi. Nuqtaviy invalidatsiya (faqat o'zgartirilgan yozuvning) bu muammoni bartaraf qiladi.
Ilovaning sovuq starti — mobil qurilmalarda kesh faqat jarayon xotirasida mavjud. Ilova qayta ishga tushirilgandan keyin kesh bo'sh bo'ladi va barcha so'rovlar serverga ketadi. Yechim: seanslar orasida keshni diskda saqlash (Room, SQLite) va startda asosiy ma'lumotlarni oldindan yuklashdan foydalanish.
Usulning g'oyasi — kesh xatosi aniqlanganda birinchi oqim blokirovkani (lock) egallaydi va manbadan ma'lumot yuklashni boshlaydi. Qolgan oqimlar blokirovka tugashini kutadi va yangilangan keshni o'qiydi. Blokirovka Redis SETNX, ZooKeeper yoki hatto xotiradagi mutex orqali amalga oshirilishi mumkin.
Asosiy parametr — lock_timeout. Juda qisqa bo'lsa, birinchi oqim keshni yangilashga ulgurmaydi va ikkinchi oqim ham ma'lumot yuklashga urinib, mini-stampede yaratadi. Juda uzun bo'lsa — mijozlar kerakligidan ko'proq kutadi. Tavsiya etilgan qiymat: odatdagi ma'lumotlar bazasi so'rovlari uchun 2-5 soniya.
Yagona oqim muammosi — birinchi oqimning xatosi (istisno, timeout) paytida blokirovka egallangan holda qoladi va barcha boshqa oqimlar lock_timeout tugashini kutadi. Yechim: blokirovkani finally blokida o'chirish. Redis Best Practices (2025) ma'lumotlariga ko'ra, blokirovkalarni atomik o'rnatish va bo'shatish uchun Lua skriptlaridan foydalanish tavsiya etiladi.
-- Atomic lock acquisition script for Redis
if redis.call("SET", KEYS[1], "locked", "NX", "EX", ARGV[1]) then
return true
else
return false
end
Ushbu Lua skripti atomik ravishda blokirovkani TTL bilan tekshiradi va o'rnatadi. Atomiklik ikki bir vaqtda so'rovning blokirovka ololmasligini kafolatlaydi — faqat bittasi, bu esa Cache Stampede-ni to'liq oldini oladi.
Probabilistic Early Expiration (PEE) — blokirovkasiz nafis usul. G'oya shundan iboratki, har bir mijoz ma'lum bir ehtimollik bilan keshni haqiqiy muddati tugashidan oldin qayta hisoblaydi. Yozuv muddatning tugashiga qanchalik yaqin bo'lsa — ehtimollik shunchalik yuqori. Bu qayta yuklashlarni vaqt bo'yicha tabiiy ravishda taqsimlaydi va eng yuqori yuk tekislanadi.
XFetch algoritmi — Vattani, Chierichetti va Panconesi (2015) tomonidan taklif qilingan. Ehtimollik formulasi: p = max(0, 1 - (beta * age / ttl)), bu yerda beta — notekislik parametri (odatda 1.0). age = 0 bo'lganda → p = 1 (nol yoshda kafolatlangan yangilash, bu noto'g'ri). Shuning uchun modifikatsiya ishlatiladi: p = max(0, (ttl - age) / (ttl * beta)).
Etsy Engineering (2024) ma'lumotlariga ko'ra, Memcached-da XFetch-ning joriy etilishi stampede hodisalari sonini kuniga 12 tadan 0 ga tushirdi, ma'lumotlar bazasiga eng yuqori yuk esa 78% kamaydi. Randomizatsiyalangan yangilash blokirovka va sinxronizatsiyani talab qilmaydi, bu XFetch-ni mikrosxizmat arxitekturasi uchun ideal qiladi.
Mobil mijozlar uchun PEE dastur tomonida qo'llanilishi mumkin: mijozlar tasodifiy ravishda kesh rasman muddati tugashidan oldin yangilashni boshlaydi. Masalan, age > 80% TTL bo'lganda, har bir so'rov 20% ehtimollik bilan ma'lumotlarni yangilaydi. Tarqatilgan mobil qurilmalar sinxron zarba ehtimolini qo'shimcha ravishda kamaytiradigan tabiiy shovqin yaratadi.
Yondashuv g'oyasi — kesh muddati tugashidan oldin yangilash, xatoni to'liq bartaraf qilish. Fon jarayoni (cron, Kubernetes-dagi scheduler) vaqti-vaqti bilan mashhur kalitlarni tekshiradi va ularni yangi TTL bilan qayta yozadi. Mijozlar har doim keshni haqiqiy deb topadi — stampede ta'rifiga ko'ra mumkin emas.
Time-To-Refresh (TTR) — muddat tugashiga qancha qolganda yangilashni boshlashni belgilaydigan parametr. Masalan, TTL = 300 soniya, TTR = 60 soniya: 240 soniya belgisida fon jarayoni ma'lumotlarni qayta yozadi. Bu mijozlar hech qachon bo'sh kesh ko'rmasligini kafolatlaydi.
Oldindan yangilashning salbiy tomoni — doimiy yuk ma'lumot manbaiga, hech kim yozuvni so'ramasa ham. Kam ishlatiladigan ma'lumotlar uchun bu samarasiz. Yechim: kalitga so'rovlar chastotasini (access frequency) kuzatish va faqat mashhur yozuvlarni yangilash. Adaptiv TTR — yangilash oralig'i so'rovlar tarixi asosida dinamik hisoblanadigan ilg'or texnika.
Mutex blokirovkasi — o'rtacha yukli tizimlar uchun mos (kalit boshiga 10 000 rps gacha). Amalga oshirish oddiy va manba faqat bitta yangilash so'rovini olishini kafolatlaydi. Salbiy tomoni — blokirovkalar kutayotgan oqimlar uchun kechikish yaratadi.
Probabilistic Early Expiration / XFetch — yuqori yuklar va taqsimlangan tizimlar uchun optimal. Blokirovka talab qilmaydi, gorizontal masshtablanadi, eng yuqori yuk tabiiy ravishda tekislanadi. Minglab mijozlari bo'lgan Redis-klasterlari va Memcached uchun tavsiya etiladi.
Oldindan yangilash — bashorat qilinadigan kirish namunasi bo'lgan muhim ma'lumotlar uchun ideal (konfiguratsiyalar, ma'lumotnomalar, asosiy metama'lumotlar). Fon jarayoni uchun qo'shimcha infratuzilma talab qiladi.
Mijozdagi disk keshi — mobil ilovalar uchun eng muhim himoya darajasi. Server keshi invalidatsiya qilingan bo'lsa ham, mobil mijoz yangi so'rov bajarilayotganda diskdagi ma'lumotlarni ko'rsatishi mumkin. Room + Stale-While-Revalidate — Google (2025) tomonidan tavsiya etilgan naqsh bo'lib, mijoz tomonida Cache Stampede-ni to'liq bartaraf qiladi.
Tez-tez beriladigan savollar
Cache Stampede — bir vaqtning o'zida bo'sh keshni aniqlagan qonuniy mijozlarning normal xatti-harakati natijasidir. DDoS — qasddan qilingan hujum. Stampede uchun himoya algoritmlari yetarli; DDoS uchun qo'shimcha trafik filtrlash infratuzilmasi talab qilinadi.
Ma'lumot manbaidagi RPS grafiklarini (ma'lumotlar bazasi, API) kuzating. Kesh muddati tugash momenti bilan sinxronlashtirilgan muntazam yuk cho'qqilarini ko'rsangiz — bu Cache Stampede. Har bir mashhur kalit uchun cache miss rate metrikasini qo'shing.
Ha, agar ilovada bir nechta oqim umumiy xotira keshidan foydalansa. Masalan, 10 ta korutin bir vaqtning o'zida foydalanuvchi profilini so'raydi — birinchisi bloklaydi, qolgan 9 tasi so'rovni takrorlashi mumkin. Kotlin kutubxonasi kotlinx.coroutines buni CoroutineCache yoki Flow.distinctUntilChanged orqali hal qiladi.
beta = 1.0 — teng taqsimlashni beradigan standart qiymat. Agressiv himoya uchun (kamroq xato ehtimoli) beta-ni 1.5–2.0 gacha oshiring. Manba resurslarini tejash uchun — 0.5 gacha kamaytiring. Tavsiya etilgan diapazon: 0.8–1.2.
Ha, Cache-Control: stale-while-revalidate va Cache-Control: stale-if-error mexanizmi orqali. CDN eskirgan versiyani qaytaradi va fonda keshni yangilaydi, bu PEE-ning CDN analogidir. Cloudflare va Fastly ushbu direktivalarni 2023 yildan beri qo'llab-quvvatlaydi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.