Concurrency Safety
Concurrency xavfsizligi
Haqiqiy serverda ko'plab so'rovlar bir vaqtda, turli goroutinalarda Allowni chaqiradi. Concurrency Fundamentals kursidagi Race Detection darsida ko'rganingizdek, bir nechta goroutina sinxronlashsiz bitta map'ni bir vaqtda o'qib-yozsa, bu data race — natija buzilishi yoki dastur hatto qulashi mumkin.
Yechim — o'sha kursdagi Mutex naqshi: butun Allow metodini sync.Mutex bilan himoyalash, shunda bir vaqtning o'zida faqat bitta goroutina hisoblagichni o'qiydi va o'zgartiradi.
type SafeRateLimiter struct {
mu sync.Mutex
limit int
counts map[string]int
}
func (l *SafeRateLimiter) Allow(id string) bool {
l.mu.Lock()
defer l.mu.Unlock()
// ... Allow or Deny darsidagi mantiq shu yerda ...
}>_ Exercise
mu sync.Mutex, limit int va counts map[string]int maydonlariga ega SafeRateLimiter struct'ini va NewSafeRateLimiter(limit int) *SafeRateLimiter konstruktorini yozing. Allow(id string) bool metodini yozing — u avval l.mu.Lock() va defer l.mu.Unlock() qiladi, so'ngra Allow or Deny darsidagi kabi tekshirib, hisoblagichni oshiradi.
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
sync.Mutex bilan himoyalangan Allow metodi — production rate limiter'larning yakuniy, ishlab chiqarishga tayyor shakli: bir nechta goroutina bir vaqtda murojaat qilsa ham, hisoblagich har doim izchil (consistent) va aniq qoladi.
$ go run main.go
Kodingizni ishga tushiring