GoDasturchi
Concurrent-Safe Rate Limiter

Concurrent-Safe Rate Limiter

Concurrent-xavfsiz rate limiter

Haqiqiy serverda ko'plab so'rovlar bir vaqtda, turli goroutinalarda keladi. Oldingi darsdagi Limiter xavfli: agar ikkita goroutina bir vaqtda yangi kalit uchun savat yaratsa, ular bir-birining ustidan yozib, bittasi yo'qolishi mumkin (map yozish poyga sharoiti) — yoki ikkalasi ham bitta savatning tokensini bir vaqtda kamaytirib, sanashni buzishi mumkin.

Yechim — Mutexes darsidagi naqsh: butun Allow metodini sync.Mutex bilan himoyalash, shunda bir vaqtning o'zida faqat bitta goroutina savatlar map'ini o'qishi/yozishi va tokenlarni kamaytirishi mumkin.

example.go
func (l *SafeLimiter) Allow(key string) bool {
    l.mu.Lock()
    defer l.mu.Unlock()
    // ... savatni topish/yaratish va Allow qilish shu yerda ...
}

>_ Exercise

mu sync.Mutex, capacity int va buckets map[string]*TokenBucket maydonlariga ega SafeLimiter struct'ini va NewSafeLimiter(capacity int) *SafeLimiter konstruktorini yozing. Allow(key string) bool metodini yozing — u avval l.mu.Lock() va defer l.mu.Unlock() qiladi, so'ngra (Per-Key Rate Limiting darsidagidek) savatni topib/yaratib, tokenni sarflashga urinadi.

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

sync.Mutex bilan himoyalangan Allow metodi — production rate limiter'larning asosiy naqshi: bir nechta goroutina bir vaqtda murojaat qilsa ham, savatlar map'i va har bir savatning hisoblagichi doim izchil (consistent) qoladi.

NEXT UP

Sliding Window Counter

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Concurrent-Safe Rate Limiter

Concurrent-xavfsiz rate limiter

Haqiqiy serverda ko'plab so'rovlar bir vaqtda, turli goroutinalarda keladi. Oldingi darsdagi Limiter xavfli: agar ikkita goroutina bir vaqtda yangi kalit uchun savat yaratsa, ular bir-birining ustidan yozib, bittasi yo'qolishi mumkin (map yozish poyga sharoiti) — yoki ikkalasi ham bitta savatning tokensini bir vaqtda kamaytirib, sanashni buzishi mumkin.

Yechim — Mutexes darsidagi naqsh: butun Allow metodini sync.Mutex bilan himoyalash, shunda bir vaqtning o'zida faqat bitta goroutina savatlar map'ini o'qishi/yozishi va tokenlarni kamaytirishi mumkin.

example.go
func (l *SafeLimiter) Allow(key string) bool {
    l.mu.Lock()
    defer l.mu.Unlock()
    // ... savatni topish/yaratish va Allow qilish shu yerda ...
}

>_ Exercise

mu sync.Mutex, capacity int va buckets map[string]*TokenBucket maydonlariga ega SafeLimiter struct'ini va NewSafeLimiter(capacity int) *SafeLimiter konstruktorini yozing. Allow(key string) bool metodini yozing — u avval l.mu.Lock() va defer l.mu.Unlock() qiladi, so'ngra (Per-Key Rate Limiting darsidagidek) savatni topib/yaratib, tokenni sarflashga urinadi.

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

sync.Mutex bilan himoyalangan Allow metodi — production rate limiter'larning asosiy naqshi: bir nechta goroutina bir vaqtda murojaat qilsa ham, savatlar map'i va har bir savatning hisoblagichi doim izchil (consistent) qoladi.

NEXT UP

Sliding Window Counter