ratelimit

package module
v0.0.0-...-ac9a8e2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 22, 2025 License: MIT Imports: 8 Imported by: 0

README

ratelimit

GoDoc

ratelimit is a Go package that provides common rate limiting algorithms. It supports various rate limiting strategies including fixed window, max concurrency, and throttling.

Features

  • Fixed Window Rate Limiter: Limits the number of requests in a fixed time window.
  • Max Concurrency Rate Limiter: Limits the number of concurrent requests.
  • Throttle Rate Limiter: Ensures a minimum time interval between requests.

Installation

To install the package, run:

go get github.com/ericxiao417/ratelimit

Usage

Fixed Window Rate Limiter

The Fixed Window Rate Limiter limits the number of requests in a fixed time window.

package main

import (
	"time"
	"github.com/ericxiao417/ratelimit"
)

func main() {
	r, err := ratelimit.NewFixedWindowRateLimiter(&ratelimit.Config{
		Limit:         5,
		FixedInterval: 15 * time.Second,
	})

	if err != nil {
		panic(err)
	}

	ratelimit.DoWork(r, 10)
}
Max Concurrency Rate Limiter

The Max Concurrency Rate Limiter limits the number of concurrent requests.

package main

import (
	"time"
	"github.com/ericxiao417/ratelimit"
)

func main() {
	r, err := ratelimit.NewMaxConcurrencyRateLimiter(&ratelimit.Config{
		Limit:            4,
		TokenResetsAfter: 10 * time.Second,
	})

	if err != nil {
		panic(err)
	}

	ratelimit.DoWork(r, 10)
}
Throttle Rate Limiter

The Throttle Rate Limiter ensures a minimum time interval between requests.

package main

import (
	"time"
	"github.com/ericxiao417/ratelimit"
)

func main() {
	r, err := ratelimit.NewThrottleRateLimiter(&ratelimit.Config{
		Throttle: 1 * time.Second,
	})

	if err != nil {
		panic(err)
	}

	ratelimit.DoWork(r, 10)
}

Configuration

The Config struct is used to configure the rate limiters:

type Config struct {
	// Limit determines how many rate limit tokens can be active at a time
	Limit int

	// FixedInterval sets the fixed time window for a Fixed Window Rate Limiter
	FixedInterval time.Duration

	// Throttle is the min time between requests for a Throttle Rate Limiter
	Throttle time.Duration

	// TokenResetsAfter is the maximum amount of time a token can live before being
	// forcefully released - if set to zero time then the token may live forever
	TokenResetsAfter time.Duration
}

Error Handling

The package defines several errors that can be used for error handling:

var (
	ErrInvalidLimit           = errors.New("Limit must be greater than zero")
	ErrInvalidInterval        = errors.New("Interval must be greater than zero")
	ErrTokenFactoryNotDefined = errors.New("Token factory must be defined")
)

License

This project is licensed under the MIT License - see the LICENSE file for details.

Contributing

Contributions are welcome! Please open an issue or submit a pull request for any improvements or bug fixes.

Acknowledgements

This package was created by ericxiao417.

References

Documentation

Index

Constants

View Source
const MaxInt = int(MaxUint >> 1)

MaxInt holds the maximum int value

View Source
const MaxUint = ^uint(0)

MaxUint holds the maximum unsigned int value

Variables

View Source
var (
	ErrInvalidLimit           = errors.New("Limit must be greater than zero")
	ErrInvalidInterval        = errors.New("Interval must be greater than zero")
	ErrTokenFactoryNotDefined = errors.New("Token factory must be defined")
)

Errors used throughout the codebase

Functions

func DoWork

func DoWork(r RateLimiter, workerCount int)

Types

type Config

type Config struct {
	// Limit determines how many rate limit tokens can be active at a time
	Limit int

	// FixedInterval sets the fixed time window for a Fixed Window Rate Limiter
	FixedInterval time.Duration

	// Throttle is the min time between requests for a Throttle Rate Limiter
	Throttle time.Duration

	// TokenResetsAfter is the maximum amount of time a token can live before being
	// forcefully released - if set to zero time then the token may live forever
	TokenResetsAfter time.Duration
}

Config represents a rate limiter config object

type FixedWindowInterval

type FixedWindowInterval struct {
	// contains filtered or unexported fields
}

FixedWindowInterval represents a fixed window of time with a start / end time

type Manager

type Manager struct {
	// contains filtered or unexported fields
}

Manager implements a rate limiter interface.

func NewManager

func NewManager(conf *Config) *Manager

NewManager creates a manager type

func (*Manager) Acquire

func (m *Manager) Acquire() (*Token, error)

Acquire is called to acquire a new token

func (*Manager) Release

func (m *Manager) Release(t *Token)

Release is called to release an active token

type RateLimiter

type RateLimiter interface {
	Acquire() (*Token, error)
	Release(*Token)
}

RateLimiter defines two methods for acquiring and releasing tokens

func NewFixedWindowRateLimiter

func NewFixedWindowRateLimiter(conf *Config) (RateLimiter, error)

NewFixedWindowRateLimiter returns a fixed window rate limiter

func NewMaxConcurrencyRateLimiter

func NewMaxConcurrencyRateLimiter(conf *Config) (RateLimiter, error)

NewMaxConcurrencyRateLimiter returns a max concurrency rate limiter

func NewThrottleRateLimiter

func NewThrottleRateLimiter(conf *Config) (RateLimiter, error)

NewThrottleRateLimiter returns a throttle rate limiter

type Token

type Token struct {
	// The unique token ID
	ID string

	// The time at which the token was created
	CreatedAt time.Time

	// Defines the min amount of time the token must live before being released
	ExpiresAt time.Time
}

Token represents a Rate Limit Token

func NewToken

func NewToken() *Token

NewToken creates a new token

func (*Token) IsExpired

func (t *Token) IsExpired() bool

IsExpired returns true if current time is greater than expiration time

func (*Token) NeedReset

func (t *Token) NeedReset(resetAfter time.Duration) bool

NeedReset returns true if elapsed time since token was created is greater than provided reset duration

Directories

Path Synopsis
examples

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL
JackTT - Gopher 🇻🇳