Allow or Deny: Weighted Requests
Ruxsat yoki rad: og'irlikga ega so'rovlar
Ba'zi so'rovlar boshqalaridan "qimmatroq" bo'ladi — masalan, katta fayl yuklash bitta token o'rniga 5 tokenni sarflashi kerak bo'lishi mumkin. AllowN — bu g'oyani amalga oshiradigan umumlashtirilgan versiya: Allow() shunchaki AllowN(1)ning maxsus holati bo'lib qoladi.
func (b *TokenBucket) AllowN(n int) bool {
if b.tokens < n {
return false
}
b.tokens -= n
return true
}Muhim nozik nuqta: tekshirish (b.tokens < n) va kamaytirish (b.tokens -= n) bitta chaqiruv ichida sodir bo'ladi. Agar bu ikkitasini alohida qilsangiz (avval tekshirib, keyin boshqa joyda kamaytirsangiz), Mutexes darsida ko'radigan poyga sharoiti paydo bo'lishi mumkin edi — ikkita so'rov bir vaqtda tekshirib, ikkalasi ham "ruxsat bor" deb o'ylab, savatni manfiyga tushirib yuborishi mumkin.
>_ Exercise
AllowN(n int) bool metodini yozing. Agar tokensda kamida n ta token bo'lsa, ularni sarflab true qaytaring; aks holda hech narsani o'zgartirmasdan false qaytaring.
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
"Tekshir-va-amalga oshir" mantig'i (AllowN) bitta metod chaqiruvi ichida bo'lishi kerak — bu tekshirish va o'zgartirish orasida boshqa kod "kirib qolishi"ning oldini oladi, keyinchalik concurrent kirish paytida juda muhim bo'ladigan xususiyat.
NEXT UP
Per-Key Rate Limiting
$ go run main.go
Kodingizni ishga tushiring