1
0
mirror of synced 2024-11-21 20:46:05 +03:00

noop limiter & interface for limiter

This commit is contained in:
Pavel 2024-04-17 11:24:02 +03:00
parent c2c33aeb7d
commit 6814216f80
3 changed files with 24 additions and 8 deletions

View File

@ -36,7 +36,7 @@ func (c *MgClient) WithLogger(logger BasicLogger) *MgClient {
}
// WithLimiter sets the provided limiter instance into the Client.
func (c *MgClient) WithLimiter(limiter *TokensBucket) *MgClient {
func (c *MgClient) WithLimiter(limiter Limiter) *MgClient {
c.limiter = limiter
return c
}

View File

@ -7,11 +7,21 @@ import (
"time"
)
// NoopLimiter implements Limiter but doesn't limit anything.
var NoopLimiter Limiter = &noopLimiter{}
type token struct {
rps atomic.Uint32
lastUse atomic.Value
}
// Limiter implements some form of rate limiting.
type Limiter interface {
// Obtain the right to send a request. Should lock the execution if current goroutine needs to wait.
Obtain(string)
}
// TokensBucket implements basic Limiter with fixed window and fixed amount of tokens per window.
type TokensBucket struct {
maxRPS uint32
tokens sync.Map
@ -21,7 +31,8 @@ type TokensBucket struct {
sleep sleeper
}
func NewTokensBucket(maxRPS uint32, unusedTokenTime, checkTokenTime time.Duration) *TokensBucket {
// NewTokensBucket constructs TokensBucket with provided parameters.
func NewTokensBucket(maxRPS uint32, unusedTokenTime, checkTokenTime time.Duration) Limiter {
bucket := &TokensBucket{
maxRPS: maxRPS,
unusedTokenTime: unusedTokenTime,
@ -79,6 +90,11 @@ func (m *TokensBucket) deleteUnusedToken() {
}
}
type noopLimiter struct{}
func (l *noopLimiter) Obtain(string) {}
// sleeper sleeps. This thing is necessary for tests.
type sleeper interface {
Sleep(time.Duration)
}

View File

@ -83,7 +83,7 @@ type MgClient struct {
Debug bool `json:"debug"`
httpClient *http.Client `json:"-"`
logger BasicLogger `json:"-"`
limiter *TokensBucket `json:"-"`
limiter Limiter `json:"-"`
}
// Channel type.