24-avgust, 2026 · 3 daqiqa
Cheklamaydigan chastota cheklagichi
Chastota cheklovi oddiy xotira hisoblagichi sifatida yozilgan edi. Bitta serverda bu to'g'ri. Muammo sayt serversiz platformada yashaganda paydo bo'ladi.
U yerda «bitta server» yo'q. Har bir so'rov funksiya nusxasiga tushadi, har birining o'z xotirasi bor. «Daqiqasiga o'ttiz» aslida «har bir nusxaga o'ttiz» degani.
Oddiy yuklamada bitta nusxa bo'ladi va cheklagich ishlaydi — barcha tekshiruvlar o'tadi. Haqiqiy yuklamada, ya'ni u kerak bo'lgan paytda, nusxalar ko'payadi va chegara tarqalib ketadi.
Yechim: hisoblagich umumiy bo'lishi kerak. HTTP orqali Redis juda mos keladi.
Ikki nozik joy: kalitning yashash muddatini faqat yaratishda qo'yish kerak; va agar saqlagich javob bermasa, hammani o'tkazib yubormasdan xotira hisoblagichiga qaytish kerak.
export async function rateLimit( key: string, limit = 8, windowMs = 60_000,): Promise<RateLimitResult> { const url = envString("UPSTASH_REDIS_REST_URL"); const token = envString("UPSTASH_REDIS_REST_TOKEN"); if (url && token) { const result = await inRedis(url, token, `rl:${key}`, limit, windowMs); /* Redis не ответил — считаем в памяти, а не пропускаем всех. Отказ хранилища не повод снимать защиту, но и повесить сайт из-за него нельзя: в памяти предел слабее, но он есть. */ if (result) return result; } return inMemory(key, limit, windowMs);}