Rate Limiting
So'rovlar tezligini cheklash
Konsertga bilet sotuvchi bitta kassa oynasi orqali soatiga cheklangan miqdorda bilet sota oladi — agar hamma birdan bostirib kirsa, tizim tanga aylanadi. Rate Limiting (tezlikni cheklash) — bizning /shorten endpoint'imizni shu xil "bostirib kirish"dan (yoki xato/tajovuzkor kod tomonidan ortiqcha so'rov yuborilishidan) himoya qiladi.
package main
import (
"fmt"
"sync"
)
// RateLimiter — har bir mijoz uchun ruxsat etilgan so'rovlar sonini kuzatadi
type RateLimiter struct {
mu sync.Mutex
counts map[string]int
maxCount int
}
func NewRateLimiter(maxCount int) *RateLimiter {
return &RateLimiter{counts: make(map[string]int), maxCount: maxCount}
}
func (rl *RateLimiter) Allow(clientID string) bool {
rl.mu.Lock()
defer rl.mu.Unlock()
if rl.counts[clientID] >= rl.maxCount {
return false
}
rl.counts[clientID]++
return true
}
func main() {
limiter := NewRateLimiter(2)
fmt.Println(limiter.Allow("client-1"))
fmt.Println(limiter.Allow("client-1"))
fmt.Println(limiter.Allow("client-1"))
}Bu — soddalashtirilgan rate limiter: har bir clientID (masalan foydalanuvchi IP-manzili) uchun so'rovlar sonini hisoblab boradi, va maxCountdan oshsa, Allow false qaytaradi. sync.Mutex ishlatilgani (RWMutex emas) — bu yerda deyarli har bir chaqiruv counts xaritasini O'ZGARTIRADI (o'qish bilan birga), shuning uchun o'qish-yozishni ajratishning foydasi yo'q.
Production tizimlarda bu hisoblagichlar odatda VAQT OYNASI bilan (masalan "har daqiqada eng ko'pi bilan 10 ta so'rov") ishlaydi — bizning oddiy versiyamiz esa g'oyani ko'rsatish uchun hisoblagichni faqat CHEKSIZ oshirib boradi. Bu rate limiter'ni makeShortenHandlerga "HTTP Service Communication" darsidagi kabi PARAMETR sifatida berib, har bir so'rovdan oldin Allow tekshirilishi mumkin.
>_ Exercise
RateLimiter'ga hisoblagichlarni tozalash (Reset) imkonini qo'shing.
- •Reset(clientID string) metodini yozing: delete(rl.counts, clientID) qiling (mu.Lock bilan himoyalab)
- •"client-1" uchun Allow'ni 2 marta chaqiring (ikkalasi ham true bo'lishi kerak), so'ng Reset qiling
- •Reset'dan keyin yana Allow("client-1") ni chaqirib, natijasini chop eting
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Rate limiting — har bir mijoz uchun so'rovlar sonini hisoblab, belgilangan chegaradan oshganda so'rovlarni rad etib, xizmatni ortiqcha yuklanishdan himoya qiladi.
NEXT UP
Putting It All Together
$ go run main.go
Kodingizni ishga tushiring