Skip to content

Commit

Permalink
noop limiter & interface for limiter
Browse files Browse the repository at this point in the history
  • Loading branch information
Neur0toxine authored Apr 17, 2024
2 parents c2c33ae + 6814216 commit e42fb9c
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 8 deletions.
2 changes: 1 addition & 1 deletion v1/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down
18 changes: 17 additions & 1 deletion v1/rate_limit.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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,
Expand Down Expand Up @@ -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)
}
Expand Down
12 changes: 6 additions & 6 deletions v1/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,12 +78,12 @@ const (

// MgClient type.
type MgClient struct {
URL string `json:"url"`
Token string `json:"token"`
Debug bool `json:"debug"`
httpClient *http.Client `json:"-"`
logger BasicLogger `json:"-"`
limiter *TokensBucket `json:"-"`
URL string `json:"url"`
Token string `json:"token"`
Debug bool `json:"debug"`
httpClient *http.Client `json:"-"`
logger BasicLogger `json:"-"`
limiter Limiter `json:"-"`
}

// Channel type.
Expand Down

0 comments on commit e42fb9c

Please sign in to comment.