Rate Limit Pattern
Fitur
Rate Limit
Semaphore
Jenis-Jenis Rate Limiting
Implementasi Simple Rate Limit
package rate_limiter
import (
"sync"
"time"
)
// RateLimiter menggunakan Token Bucket
type RateLimiter struct {
mu sync.Mutex
rate int // Requests per second
burst int // Maximum burst capacity
tokens int // Available tokens
lastChecked time.Time // Last refill time
}
// NewRateLimiter membuat RateLimiter baru
func NewRateLimiter(rate, burst int) *RateLimiter {
return &RateLimiter{
rate: rate,
burst: burst,
tokens: burst,
lastChecked: time.Now(),
}
}
// Allow mengecek apakah request bisa diproses
func (rl *RateLimiter) Allow() bool {
rl.mu.Lock()
defer rl.mu.Unlock()
now := time.Now()
elapsed := now.Sub(rl.lastChecked).Seconds()
rl.lastChecked = now
// Tambah token berdasarkan waktu berlalu
rl.tokens += int(elapsed * float64(rl.rate))
if rl.tokens > rl.burst {
rl.tokens = rl.burst
}
// Jika masih ada token, izinkan request
if rl.tokens > 0 {
rl.tokens--
return true
}
return false
}Kesimpulan
Last updated