To implement a rate limiter using sync.Ticker
and sync.Mutex
in Golang, follow these steps:
import (
"sync"
"time"
)
type RateLimiter struct {
limiter *sync.Ticker
mutex *sync.Mutex
throttle <-chan time.Time
}
NewRateLimiter
function to initialize the rate limiter:func NewRateLimiter(rps int) *RateLimiter {
rl := &RateLimiter{
limiter: time.NewTicker(time.Second / time.Duration(rps)),
mutex: &sync.Mutex{},
throttle: nil,
}
return rl
}
Throttle
method to limit the rate of execution:func (rl *RateLimiter) Throttle() {
<-rl.GetThrottle()
}
func (rl *RateLimiter) GetThrottle() <-chan time.Time {
rl.mutex.Lock()
defer rl.mutex.Unlock()
if rl.throttle == nil {
rl.throttle = rl.limiter.C
}
return rl.throttle
}
func main() {
rl := NewRateLimiter(10) // 10 requests per second
for i := 0; i < 20; i++ {
rl.Throttle()
// Perform the desired operations
}
}
In the example above, a rate limiter with a limit of 10 requests per second is created using NewRateLimiter(10)
. The Throttle
function will limit the rate of execution to match the specified limit.
Note that the Throttle
function uses the GetThrottle
function to retrieve the throttle channel and wait for the appropriate time before proceeding. The GetThrottle
function ensures that only one goroutine sets the throttle channel at a time using a mutex.
The rate limiter can be used in any section of the code that requires limiting the rate of execution by calling rl.Throttle()
before executing the desired operations.