Documentation ¶
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type AllowRequest ¶
type Driver ¶
type Driver interface {
Reserve(ctx context.Context, req *ReserveRequest) (*Reservation, error)
}
func DriverGORM ¶
Example ¶
package main import ( "context" "fmt" "time" "github.com/molon/ratelimiter" ) func runExample(limiter *ratelimiter.RateLimiter) { // every 10 min , burst 5 durationPerToken := 10 * time.Minute burst := int64(5) now := time.Now() key := "test_allow" ctx := context.Background() try := func(delta time.Duration) bool { reserveReq := &ratelimiter.ReserveRequest{ Key: key, DurationPerToken: durationPerToken, Burst: burst, Now: now.Add(delta), Tokens: 1, MaxFutureReserve: 0, } r, err := limiter.Reserve(ctx, reserveReq) if err != nil { panic(err) } if r.OK { fmt.Printf("%v: allowed: %t\n", delta, r.OK) return true } fmt.Printf("%v: allowed: %t , you can retry after %v\n", delta, false, r.RetryAfterFrom(reserveReq.Now)) return false } for i := 0; i < int(25); i++ { delta := time.Duration(i) * time.Minute try(delta) } fmt.Printf("--- Sleep 20 minutes ---\n") for i := 45; i < int(55); i++ { delta := time.Duration(i) * time.Minute try(delta) } fmt.Printf("--- Sleep 100 minutes ---\n") for i := 155; i < int(165); i++ { delta := time.Duration(i) * time.Minute try(delta) } } func main() { resetDB() limiter := ratelimiter.New( ratelimiter.DriverGORM(db), ) runExample(limiter) }
Output: 0s: allowed: true 1m0s: allowed: true 2m0s: allowed: true 3m0s: allowed: true 4m0s: allowed: true 5m0s: allowed: false , you can retry after 5m0s 6m0s: allowed: false , you can retry after 4m0s 7m0s: allowed: false , you can retry after 3m0s 8m0s: allowed: false , you can retry after 2m0s 9m0s: allowed: false , you can retry after 1m0s 10m0s: allowed: true 11m0s: allowed: false , you can retry after 9m0s 12m0s: allowed: false , you can retry after 8m0s 13m0s: allowed: false , you can retry after 7m0s 14m0s: allowed: false , you can retry after 6m0s 15m0s: allowed: false , you can retry after 5m0s 16m0s: allowed: false , you can retry after 4m0s 17m0s: allowed: false , you can retry after 3m0s 18m0s: allowed: false , you can retry after 2m0s 19m0s: allowed: false , you can retry after 1m0s 20m0s: allowed: true 21m0s: allowed: false , you can retry after 9m0s 22m0s: allowed: false , you can retry after 8m0s 23m0s: allowed: false , you can retry after 7m0s 24m0s: allowed: false , you can retry after 6m0s --- Sleep 20 minutes --- 45m0s: allowed: true 46m0s: allowed: true 47m0s: allowed: false , you can retry after 3m0s 48m0s: allowed: false , you can retry after 2m0s 49m0s: allowed: false , you can retry after 1m0s 50m0s: allowed: true 51m0s: allowed: false , you can retry after 9m0s 52m0s: allowed: false , you can retry after 8m0s 53m0s: allowed: false , you can retry after 7m0s 54m0s: allowed: false , you can retry after 6m0s --- Sleep 100 minutes --- 2h35m0s: allowed: true 2h36m0s: allowed: true 2h37m0s: allowed: true 2h38m0s: allowed: true 2h39m0s: allowed: true 2h40m0s: allowed: false , you can retry after 5m0s 2h41m0s: allowed: false , you can retry after 4m0s 2h42m0s: allowed: false , you can retry after 3m0s 2h43m0s: allowed: false , you can retry after 2m0s 2h44m0s: allowed: false , you can retry after 1m0s
type DriverFunc ¶
type DriverFunc func(ctx context.Context, req *ReserveRequest) (*Reservation, error)
func (DriverFunc) Reserve ¶
func (f DriverFunc) Reserve(ctx context.Context, req *ReserveRequest) (*Reservation, error)
type RateLimiter ¶
type RateLimiter struct {
// contains filtered or unexported fields
}
func New ¶
func New(driver Driver) *RateLimiter
func (*RateLimiter) Allow ¶
func (lim *RateLimiter) Allow(ctx context.Context, req *AllowRequest) (bool, error)
func (*RateLimiter) Reserve ¶
func (lim *RateLimiter) Reserve(ctx context.Context, req *ReserveRequest) (*Reservation, error)
type Reservation ¶
type Reservation struct { *ReserveRequest OK bool TimeToAct time.Time }
func (*Reservation) Delay ¶
func (r *Reservation) Delay() time.Duration
func (*Reservation) RetryAfter ¶
func (r *Reservation) RetryAfter() time.Duration
func (*Reservation) RetryAfterFrom ¶
func (r *Reservation) RetryAfterFrom(t time.Time) time.Duration
Click to show internal directories.
Click to hide internal directories.