Update code to use Go 1.0 types and conventions. Remove rate limiting package code and instead direct users to search godoc.org for such packages.
diff --git a/RateLimiting.md b/RateLimiting.md
index ffd29f8..468d1c9 100644
--- a/RateLimiting.md
+++ b/RateLimiting.md
@@ -1,14 +1,15 @@
# Rate Limiting
-## Time Tick based Approach
-
-To limit the rate of operations per unit time, use time.Tick:
+To limit the rate of operations per unit time, use a [time.Ticker](http://golang.org/pkg/time/#NewTicker).
+This works well for rates up to 10s per second.
+For higher rates, prefer a token bucket rate limiter (search godoc.org for
+[rate limit](http://godoc.org/?q=rate+limit)).
```go
import "time"
-rate_per_sec := 10
-throttle := time.Tick(1e9 / rate_per_sec)
+ratePerSec := 10
+throttle := time.Tick(1e9 / ratePerSec)
for req := range requests {
<-throttle // rate limit our Service.Method RPCs
go client.Call("Service.Method", req, ...)
@@ -19,15 +20,15 @@
```go
import "time"
-rate_per_sec := 10
-burst_limit := 100
-tick := time.NewTicker(1e9 / rate_per_sec)
+ratePerSec := 10
+burstLimit := 100
+tick := time.NewTicker(1e9 / ratePerSec)
defer tick.Stop()
-throttle := make(chan int64, burst_limit)
+throttle := make(chan time.Time, burstLimit)
go func() {
- for ns := range tick {
+ for t := range tick {
select {
- case: throttle <- ns
+ case: throttle <- t
default:
}
} // exits after tick.Stop()
@@ -37,110 +38,3 @@
go client.Call("Service.Method", req, ...)
}
```
-
-## Simpler Approach that doesn't need channels or go routines
-
-Here is a simpler approach that relies on the notion of elapsed time to provide rate control. It is implemented as a package so others can readily use it.
-
-
-
-```go
-//
-// Ratelimiting incoming connections - Small Library
-//
-// (c) 2013 Sudhi Herle <sudhi-dot-herle-at-gmail-com>
-//
-// License: GPLv2
-//
-// Notes:
-// - This is a very simple interface for rate limiting. It
-// implements a token bucket algorithm
-// - Based on Anti Huimaa's very clever token bucket algorithm.
-//
-// Usage:
-// rl = NewRateLimiter(rate)
-//
-// ....
-// if rl.Limit() {
-// drop_connection(conn)
-// }
-//
-package ratelimit
-
-import "time"
-
-type Ratelimiter struct {
- rate int // conn/sec
- last time.Time // last time we were polled/asked
-
- allowance float64
-}
-
-// Create new rate limiter that limits at rate/sec
-func NewRateLimiter(rate int) (*Ratelimiter, error) {
-
- r := Ratelimiter{rate: rate, last: time.Now()}
-
- r.allowance = float64(r.rate)
- return &r, nil
-}
-
-// Return true if the current call exceeds the set rate, false
-// otherwise
-func (r *Ratelimiter) Limit() bool {
-
- // handle cases where rate in config file is unset - defaulting
- // to "0" (unlimited)
- if r.rate == 0 {
- return false
- }
-
- rate := float64(r.rate)
- now := time.Now()
- elapsed := now.Sub(r.last)
- r.last = now
- r.allowance += elapsed.Seconds() * rate
-
- // Clamp number of tokens in the bucket. Don't let it get
- // unboundedly large
- if r.allowance > rate {
- r.allowance = rate
- }
-
- var ret bool
-
- if r.allowance < 1.0 {
- ret = true
- } else {
- r.allowance -= 1.0
- ret = false
- }
-
- return ret
-}
-```
-
-Using this package is quite easy:
-
-```go
- // rate limit at 100/s
- nl = ratelimit.NewRateLimiter(100)
-
- ....
- // in your event loop or network accept loop, do:
- if rl.Limit() {
- // drop the connection etc.
- // i.e., this new event has exceeded the rate of 100/s
- ...
- }
- else {
- // .. rate is not exceeded, process as needed
- ...
- }
-```
-
-[Anti Huimaa](http://stackoverflow.com/questions/667508/whats-a-good-rate-limiting-algorithm) came up with this simple algorithm.
-
-# References
-
-time.Tick: http://golang.org/pkg/time/#Tick
\ No newline at end of file