Per-Key Rate Limiting
Kalit bo'yicha rate limiting
Shu paytgacha bitta global TokenBucket bilan ishladingiz — bu barcha klientlarni bitta savatga solib qo'yadi, adolatsiz: bitta "shov-qinli" klient boshqalarning barcha tokenlarini sarflab qo'yishi mumkin. Haqiqiy rate limiter har bir klient (masalan, API kaliti yoki IP manzili) uchun alohida savat saqlaydi.
type Limiter struct {
capacity int
buckets map[string]*TokenBucket
}
func (l *Limiter) Allow(key string) bool {
b, ok := l.buckets[key]
if !ok {
b = newBucket(l.capacity)
l.buckets[key] = b
}
return b.Allow()
}Bu — YAML Data Pipeline kursidagi GroupByCategoryda ko'rgan "kerak bo'lganda yangi kalit yaratish" andazasi bilan bir xil: map[string]*TokenBucket har bir klient uchun lazy (talab bo'yicha) savat yaratadi — klient birinchi marta murojaat qilganda savat yo'q bo'lsa, shu zahoti yaratiladi.
>_ Exercise
newBucket(capacity int) *TokenBucket yordamchi funksiyasidan foydalanib (berilgan), capacity int va buckets map[string]*TokenBucket maydonlariga ega Limiter struct'ini va NewLimiter(capacity int) *Limiter konstruktorini yozing. Allow(key string) bool metodini yozing — agar key uchun savat mavjud bo'lmasa, yangisini yarating, so'ngra o'sha savatning Allow()ini chaqiring.
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
map[string]*TokenBucket har bir klient uchun mustaqil holatni saqlaydi, va "lazy yaratish" andazasi (ok bo'lmasa yarat) yangi klientlarni oldindan ro'yxatdan o'tkazish shart emasligini ta'minlaydi — birinchi so'rovning o'zi savatni yaratadi.
NEXT UP
Concurrent-Safe Rate Limiter
$ go run main.go
Kodingizni ishga tushiring