Documentation ¶
Overview ¶
Package memrate provides a rate limiter.
Index ¶
- Constants
- type Limit
- type Limiter
- func (lim *Limiter) Allow() bool
- func (lim *Limiter) AllowCtx(ctx context.Context) bool
- func (lim *Limiter) AllowE() (bool, error)
- func (lim *Limiter) AllowECtx(ctx context.Context) (bool, error)
- func (lim *Limiter) AllowN(now time.Time, n int) bool
- func (lim *Limiter) Burst() int
- func (lim *Limiter) Limit() Limit
- func (lim *Limiter) ReserveE() (time.Duration, bool, error)
- func (lim *Limiter) ReserveECtx(ctx context.Context) (time.Duration, bool, error)
- func (lim *Limiter) ReserveN(now time.Time, n int) *Reservation
- func (lim *Limiter) SetBurst(newBurst int)
- func (lim *Limiter) SetBurstAt(now time.Time, newBurst int)
- func (lim *Limiter) SetLimit(newLimit Limit)
- func (lim *Limiter) SetLimitAt(now time.Time, newLimit Limit)
- func (lim *Limiter) Wait(ctx context.Context) (err error)
- func (lim *Limiter) WaitN(ctx context.Context, n int) (err error)
- type LimiterFn
- type LimiterOption
- type MemoryStore
- type MemoryStoreOption
- type Reservation
Constants ¶
const Inf = Limit(math.MaxFloat64)
Inf is the infinite rate limit; it allows all events (even if burst is zero).
const InfDuration = time.Duration(1<<63 - 1)
InfDuration is the duration returned by Delay when a Reservation is not OK.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Limit ¶
type Limit float64
Limit defines the maximum frequency of some events. Limit is represented as number of events per second. A zero Limit allows no events.
type Limiter ¶
type Limiter struct {
// contains filtered or unexported fields
}
A Limiter controls how frequently events are allowed to happen. It implements a "token bucket" of size b, initially full and refilled at rate r tokens per second. Informally, in any large enough time interval, the Limiter limits the rate to r tokens per second, with a maximum burst size of b events. As a special case, if r == Inf (the infinite rate), b is ignored. See https://en.wikipedia.org/wiki/Token_bucket for more about token buckets.
The zero value is a valid Limiter, but it will reject all events. Use NewLimiter to create non-zero Limiters.
Limiter has three main methods, Allow, Reserve, and Wait. Most callers should use Wait.
Each of the three methods consumes a single token. They differ in their behavior when no token is available. If no token is available, Allow returns false. If no token is available, Reserve returns a reservation for a future token and the amount of time the caller must wait before using it. If no token is available, Wait blocks until one can be obtained or its associated context.Context is canceled.
The methods AllowN, ReserveN, and WaitN consume n tokens.
func NewLimiter ¶
func NewLimiter(r Limit, b int, opts ...LimiterOption) *Limiter
NewLimiter returns a new Limiter that allows events up to rate r and permits bursts of at most b tokens.
func NewLimiterLimit ¶
func NewLimiterLimit(l ratelimit.Limit, opts ...LimiterOption) *Limiter
NewLimiterLimit returns a new Limiter that allows events up to rate r and permits bursts of at most b tokens.
func (*Limiter) AllowN ¶
AllowN reports whether n events may happen at time now. Use this method if you intend to drop / skip events that exceed the rate limit. Otherwise, use Reserve or Wait.
func (*Limiter) Burst ¶
Burst returns the maximum burst size. Burst is the maximum number of tokens that can be consumed in a single call to Allow, Reserve, or Wait, so higher Burst values allow more events to happen at once. A zero Burst allows no events, unless limit == Inf.
func (*Limiter) ReserveECtx ¶
func (*Limiter) ReserveN ¶
func (lim *Limiter) ReserveN(now time.Time, n int) *Reservation
ReserveN returns a Reservation that indicates how long the caller must wait before n events happen. The Limiter takes this Reservation into account when allowing future events. The returned Reservation’s OK() method returns false if n exceeds the Limiter's burst size. Usage example:
r := lim.ReserveN(time.Now(), 1) if !r.OK() { // Not allowed to act! Did you remember to set lim.burst to be > 0 ? return } time.Sleep(r.Delay()) Act()
Use this method if you wish to wait and slow down in accordance with the rate limit without dropping events. If you need to respect a deadline or cancel the delay, use Wait instead. To drop or skip events exceeding rate limit, use Allow instead.
func (*Limiter) SetBurstAt ¶
SetBurstAt sets a new burst size for the limiter.
func (*Limiter) SetLimitAt ¶
SetLimitAt sets a new Limit for the limiter. The new Limit, and Burst, may be violated or underutilized by those which reserved (using Reserve or Wait) but did not yet act before SetLimitAt was called.
type LimiterOption ¶
type LimiterOption func(*Limiter)
func WithTimer ¶
func WithTimer(timeout time.Duration, fn func()) LimiterOption
type MemoryStore ¶
type MemoryStore struct {
// contains filtered or unexported fields
}
func NewMemoryStore ¶
func NewMemoryStore(fn LimiterFn, opts ...MemoryStoreOption) *MemoryStore
func (*MemoryStore) DeleteKey ¶
func (store *MemoryStore) DeleteKey(key string)
func (*MemoryStore) GetLimiter ¶
func (store *MemoryStore) GetLimiter(key string) ratelimit.Limiter
GetLimiter returns the rate limiter for the provided key if it exists, otherwise calls addKey to add key to the map
func (*MemoryStore) GetLimiterCtx ¶
GetLimiterCtx returns the rate limiter for the provided key if it exists, otherwise calls addKey to add key to the map
type MemoryStoreOption ¶
type MemoryStoreOption func(*MemoryStore)
func WithOnEvicted ¶
func WithOnEvicted(onEvicted func(key interface{}, value interface{})) MemoryStoreOption
WithOnEvicted set onEvicted
type Reservation ¶
type Reservation struct {
// contains filtered or unexported fields
}
A Reservation holds information about events that are permitted by a Limiter to happen after a delay. A Reservation may be canceled, which may enable the Limiter to permit additional events.
func (*Reservation) Cancel ¶
func (r *Reservation) Cancel()
Cancel is shorthand for CancelAt(time.Now()).
func (*Reservation) CancelAt ¶
func (r *Reservation) CancelAt(now time.Time)
CancelAt indicates that the reservation holder will not perform the reserved action and reverses the effects of this Reservation on the rate limit as much as possible, considering that other reservations may have already been made.
func (*Reservation) Delay ¶
func (r *Reservation) Delay() time.Duration
Delay is shorthand for DelayFrom(time.Now()).
func (*Reservation) DelayFrom ¶
func (r *Reservation) DelayFrom(now time.Time) time.Duration
DelayFrom returns the duration for which the reservation holder must wait before taking the reserved action. Zero duration means act immediately. InfDuration means the limiter cannot grant the tokens requested in this Reservation within the maximum wait time.
func (*Reservation) OK ¶
func (r *Reservation) OK() bool
OK returns whether the limiter can provide the requested number of tokens within the maximum wait time. If OK is false, Delay returns InfDuration, and Cancel does nothing.