GoDasturchi
Per-Key Rate Limiting

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.

example.go
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.

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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.

example.go
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.

Hints (0/3)

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