Sobes.tech
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.
  • Allow metodu, mövcud token olub-olmadığını yoxlayır və icazə verildikdə onları azaldır.
  • refill metodu, 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.