Назад к вопросам
Middle+
5
Реализуйте логику функции Allow для rate limiter. Как вы будете отслеживать события и проверять лимиты?
Компании, где спрашивали
ООО Дэстэн Партнерс
Ответ от нейросети
sobes.tech AI
Для реализации функции Allow в rate limiter нужно отслеживать события (например, запросы) и проверять, не превышен ли лимит за заданный интервал времени.
Пример простой реализации на Go с использованием токен-бакета:
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
}
// Использование:
// rl := NewRateLimiter(10, time.Minute)
// if rl.Allow() {
// // разрешить действие
// } else {
// // отклонить, лимит исчерпан
// }
В этой реализации:
tokens— текущее количество доступных запросов.maxTokens— максимальное количество запросов за интервал.interval— период, за который лимит обновляется.- Метод
Allowпроверяет, есть ли доступные токены, и уменьшает их количество при разрешении. - Метод
refillобновляет количество токенов по истечении интервала.
Такой подход позволяет контролировать частоту событий и предотвращать перегрузку системы.