Sobes.tech
Назад к вопросам
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 обновляет количество токенов по истечении интервала.

Такой подход позволяет контролировать частоту событий и предотвращать перегрузку системы.