github.com/soroushjp/speedbump/ginbump

A Redis-backed rate limiter in Go


Install
go get github.com/soroushjp/speedbump/ginbump

Documentation

speedbump GoDoc

A Redis-backed Rate Limiter for Go

wercker status

Cool stuff

  • Backed by Redis, so it keeps track of requests across a cluster
  • Extensible timing functions. Includes defaults for tracking requests per second, minute, and hour
  • Works with IPv4, IPv6, or any other unique identifier
  • Example middleware included for Gin (See: ginbump) and Negroni (See: negronibump)

Notes

Usage

  • Get a working Redis server
  • Go get:
$ go get github.com/etcinit/speedbump
  • Include it in your code
package main

import (
    "fmt"
    "time"

    "github.com/etcinit/speedbump"
    "gopkg.in/redis.v3"
)

func main() {
    client := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: "",
        DB:       0,
    })
    hasher := speedbump.PerSecondHasher{}

    // Here we create a limiter that will only allow 5 requests per second
    limiter := speedbump.NewLimiter(client, hasher, 5)

    for {
        // This example has a hardcoded IP, but you would replace it with the IP
        // of a client on a real case.
        success, err := limiter.Attempt("127.0.0.1")

        if err != nil {
            panic(err)
        }

        if success {
            fmt.Println("Successful!")
        } else {
            fmt.Println("Limited! :(")
        }

        time.Sleep(time.Millisecond * time.Duration(100))
    }
}
  • Output:
Successful!
Successful!
Successful!
Successful!
Successful!
Successful!
Limited! :(
Limited! :(
Limited! :(
Limited! :(
Limited! :(
Successful!
Successful!
Successful!
Successful!
Successful!
Successful!
Limited! :(
Limited! :(
Limited! :(
Limited! :(
Successful!
Successful!
...