Middle+
Rate limiter üçün Allow funksiyasının məntiqini həyata keçirin. Hadisələri necə izləyəcək və limitləri necə yoxlayacaqsınız?
sobes.tech Süni İntellekt
AI-dan cavab
Rate limiter-də Allow funksiyasını həyata keçirmək üçün hadisələri (məsələn, sorğuları) izləmək və müəyyən zaman intervalında limiti aşmadığını yoxlamaq lazımdır.
Go dilində sadə tətbiq nümunəsi, token-bak istifadə edərək:
package main
import (
"sync"
"time"
)
type RateLimiter struct {
mu sync.Mutex
tokens int
maxTokens int
interval time.Duration
lastRefill time.Time
}
func NewRateLimiter(maxTokens int, interval time.Duration) *RateLimiter {
return &RateLimiter{
tokens: maxTokens,
maxTokens: maxTokens,
interval: interval,
lastRefill: time.Now(),
}
}
func (rl *RateLimiter) refill() {
now := time.Now()
delta := now.Sub(rl.lastRefill)
if delta >= rl.interval {
rl.tokens = rl.maxTokens
rl.lastRefill = now
}
}
func (rl *RateLimiter) Allow() bool {
rl.mu.Lock()
defer rl.mu.Unlock()
rl.refill()
if rl.tokens > 0 {
rl.tokens--
return true
}
return false
}
// İstifadə:
// rl := NewRateLimiter(10, time.Minute)
// if rl.Allow() {
// // əməliyyata icazə ver
// } else {
// // rədd et, limit çatıb
// }
Bu tətbiqdə:
tokens— mövcud olan sorğu sayı.maxTokens— interval daxilində maksimal sorğu sayı.interval— limitin yeniləndiyi müddət.Allowmetodu, mövcud token olub-olmadığını yoxlayır və icazə verildikdə onları azaldır.refillmetodu, interval bitdikdən sonra token sayını yeniləyir.
Bu yanaşma hadisələrin tezliyini idarə etməyə və sistemin həddindən artıq yüklənməsinin qarşısını almağa imkan verir.