Rate Limiting: The Token Bucket Idea
Rate limiting: token bucket g'oyasi
Har qanday production backend so'rovlarni cheklashi kerak — aks holda bitta foydalanuvchi (yoki bug'li klient) butun serverni ortiqcha yuklab qo'yishi mumkin. Rate limitingning eng mashhur algoritmi — token bucket (token savati): har bir klient uchun cheklangan sig'imli "savat" bo'ladi, har bir so'rov bitta tokenni sarflaydi, va token qolmasa so'rov rad etiladi.
type TokenBucket struct {
capacity int
tokens int
}
func (b *TokenBucket) Allow() bool {
if b.tokens <= 0 {
return false
}
b.tokens--
return true
}Bu — Pointers & Memory kursidagi joyida o'zgartirish g'oyasining davomi: Allow pointer receiver orqali b.tokensni kamaytiradi, shuning uchun har bir chaqiruv keyingi chaqiruvga ta'sir qiladi. Keyingi darslarda siz bu savatga vaqt o'tishi bilan tokenlarni qayta to'ldirishni (refill) qo'shasiz — bu butun loyihaning yuragi bo'ladi.
>_ Exercise
capacity int va tokens int maydonlariga ega TokenBucket struct'ini yozing. NewTokenBucket(capacity int) *TokenBucket konstruktorini yozing — u to'liq savatni qaytaradi (tokens boshida capacityga teng). Allow() bool metodini yozing — agar token bo'lsa, uni sarflab true qaytaradi; aks holda false qaytaradi.
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Token bucket — rate limitingning eng sodda va tushunarli modeli: cheklangan sig'imli hisoblagich, har bir ruxsat berilgan amal uni kamaytiradi. Allow() bu hisoblagichni tekshirish va kamaytirishni bitta atomik (dastur mantig'i nuqtai nazaridan) qadamda bajaradi.
NEXT UP
Building a Token Bucket: Refilling Tokens
$ go run main.go
Kodingizni ishga tushiring