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.
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.
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
$ go run main.go
Kodingizni ishga tushiring