A Golang rate limit implementation which allows burst of request during the defined duration.
The original library i.e golang.org/x/time/rate implements classic token bucket algorithm allowing a burst of tokens and a refill that happens at a specified ratio by one unit at a time whereas this implementation is a variant that allows a burst of tokens just like "the token bucket" algorithm, but the refill happens entirely at the defined ratio.
This allows scanners to respect maximum defined rate limits, pause until the allowed interval hits, and then process again at maximum speed. The original library slowed down requests according to the refill ratio.
NewUnlimited(ctx) permits requests immediately without a ticker, token channel,
or background goroutine. CanTake returns true and GetLimit initially returns
math.MaxUint32. MultiLimiter and AutoLimiter use this behavior for unlimited keys.
For compatibility, calling SetLimit or SetDuration creates a finite burst bucket.
The initial burst is math.MaxUint32; a changed limit applies at the next refill.
The default refill interval is 1 ms. The refill schedule starts when the first
setter is called. SetDuration requires a positive duration.
Stop prevents later setters from starting a bucket. Requests remain nonblocking
when an unconfigured unlimited limiter is stopped or its context is canceled.
An Example showing usage of ratelimit as a library is specified below:
package main
import (
"context"
"fmt"
"time"
"github.com/projectdiscovery/ratelimit"
)
func main() {
// create a rate limiter by passing context, max tasks/requests , time interval
limiter := ratelimit.New(context.Background(), 5, time.Duration(10*time.Second))
save := time.Now()
for i := 0; i < 10; i++ {
// run limiter.Take() method before each task
limiter.Take()
fmt.Printf("Task %v completed after %v\n", i, time.Since(save))
}
/*
Output:
Task 0 completed after 4.083µs
Task 1 completed after 111.416µs
Task 2 completed after 118µs
Task 3 completed after 121.083µs
Task 4 completed after 124.583µs
Task 5 completed after 10.001356375s
Task 6 completed after 10.001524791s
Task 7 completed after 10.001537583s
Task 8 completed after 10.001542708s
Task 9 completed after 10.001548666s
*/
}