index
<em>[Rate limiting](http://en.wikipedia.org/wiki/Rate_limiting)</em> is an important mechanism for controlling resource utilization and maintaining quality of service. Go elegantly supports rate limiting with goroutines, channels, and [tickers](tickers).
package main
import (
	"fmt"
	"time"
)
func main() {
First we'll look at basic rate limiting. Suppose we want to limit our handling of incoming requests. We'll serve these requests off a channel of the same name.
	requests := make(chan int, 5)
	for i := 1; i <= 5; i++ {
		requests <- i
	}
	close(requests)
This `limiter` channel will receive a value every 200 milliseconds. This is the regulator in our rate limiting scheme.
	limiter := time.Tick(200 * time.Millisecond)
By blocking on a receive from the `limiter` channel before serving each request, we limit ourselves to 1 request every 200 milliseconds.
	for req := range requests {
		<-limiter
		fmt.Println("request", req, time.Now())
request 1 2020-10-21 16:53:50.395291385 +0000 UTC m=+0.200203008
request 2 2020-10-21 16:53:50.599166533 +0000 UTC m=+0.404078122
request 3 2020-10-21 16:53:50.795310384 +0000 UTC m=+0.600222016
request 4 2020-10-21 16:53:50.995286879 +0000 UTC m=+0.800198499
request 5 2020-10-21 16:53:51.195267593 +0000 UTC m=+1.000179165
	}
request 1 2020-10-21 16:53:51.835344603 +0000 UTC m=+0.200172935
request 2 2020-10-21 16:53:52.035349525 +0000 UTC m=+0.400177860
request 3 2020-10-21 16:53:52.235373114 +0000 UTC m=+0.600201456
request 4 2020-10-21 16:53:52.435425931 +0000 UTC m=+0.800254255
request 5 2020-10-21 16:53:52.635358659 +0000 UTC m=+1.000186981
We may want to allow short bursts of requests in our rate limiting scheme while preserving the overall rate limit. We can accomplish this by buffering our limiter channel. This `burstyLimiter` channel will allow bursts of up to 3 events.
	burstyLimiter := make(chan time.Time, 3)
Fill up the channel to represent allowed bursting.
	for i := 0; i < 3; i++ {
		burstyLimiter <- time.Now()
request 1 2020-10-21 16:54:02.816778941 +0000 UTC m=+0.200206237
request 2 2020-10-21 16:54:03.016775311 +0000 UTC m=+0.400202600
request 3 2020-10-21 16:54:03.216763927 +0000 UTC m=+0.600191169
request 4 2020-10-21 16:54:03.416764574 +0000 UTC m=+0.800191909
request 5 2020-10-21 16:54:03.616744823 +0000 UTC m=+1.000172050
	}
request 1 2020-10-21 16:54:04.232918831 +0000 UTC m=+0.200280371
request 2 2020-10-21 16:54:04.432997938 +0000 UTC m=+0.400359770
request 3 2020-10-21 16:54:04.632931045 +0000 UTC m=+0.600292602
request 4 2020-10-21 16:54:04.832919318 +0000 UTC m=+0.800280921
request 5 2020-10-21 16:54:05.032891925 +0000 UTC m=+1.000253479
Every 200 milliseconds we'll try to add a new value to `burstyLimiter`, up to its limit of 3.
	go func() {
		for t := range time.Tick(200 * time.Millisecond) {
			burstyLimiter <- t
		}
	}()
request 1 2020-10-21 16:54:10.176046549 +0000 UTC m=+0.200179195
request 2 2020-10-21 16:54:10.376067042 +0000 UTC m=+0.400199627
request 3 2020-10-21 16:54:10.576063101 +0000 UTC m=+0.600195898
request 4 2020-10-21 16:54:10.776036879 +0000 UTC m=+0.800169467
request 5 2020-10-21 16:54:10.976052867 +0000 UTC m=+1.000185446
Now simulate 5 more incoming requests. The first 3 of these will benefit from the burst capability of `burstyLimiter`.
	burstyRequests := make(chan int, 5)
	for i := 1; i <= 5; i++ {
		burstyRequests <- i
request 1 2020-10-21 16:54:17.828242725 +0000 UTC m=+0.200199154
request 2 2020-10-21 16:54:18.028291874 +0000 UTC m=+0.400248385
request 3 2020-10-21 16:54:18.228258219 +0000 UTC m=+0.600214720
request 4 2020-10-21 16:54:18.428244427 +0000 UTC m=+0.800200934
request 5 2020-10-21 16:54:18.628256684 +0000 UTC m=+1.000213216
	}
request 1 2020-10-21 16:54:19.233902539 +0000 UTC m=+0.200206278
request 2 2020-10-21 16:54:19.433884891 +0000 UTC m=+0.400188622
request 3 2020-10-21 16:54:19.633922697 +0000 UTC m=+0.600226519
request 4 2020-10-21 16:54:19.83391026 +0000 UTC m=+0.800213976
request 5 2020-10-21 16:54:20.033891067 +0000 UTC m=+1.000194793
	close(burstyRequests)
request 1 2020-10-21 16:54:20.668442616 +0000 UTC m=+0.200238556
request 2 2020-10-21 16:54:20.868384667 +0000 UTC m=+0.400180641
request 3 2020-10-21 16:54:21.068404615 +0000 UTC m=+0.600200562
request 4 2020-10-21 16:54:21.268510532 +0000 UTC m=+0.800306470
request 5 2020-10-21 16:54:21.468431947 +0000 UTC m=+1.000227939
	for req := range burstyRequests {
		<-burstyLimiter
		fmt.Println("request", req, time.Now())
request 1 2020-10-21 16:54:22.678544517 +0000 UTC m=+0.200264505
request 2 2020-10-21 16:54:22.878521123 +0000 UTC m=+0.400240991
request 3 2020-10-21 16:54:23.07852738 +0000 UTC m=+0.600247293
request 4 2020-10-21 16:54:23.278523098 +0000 UTC m=+0.800242968
request 5 2020-10-21 16:54:23.478542539 +0000 UTC m=+1.000262515
request 1 2020-10-21 16:54:23.47859248 +0000 UTC m=+1.000312349
request 2 2020-10-21 16:54:23.478600138 +0000 UTC m=+1.000320005
request 3 2020-10-21 16:54:23.478614967 +0000 UTC m=+1.000334841
request 4 2020-10-21 16:54:23.678733121 +0000 UTC m=+1.200453007
request 5 2020-10-21 16:54:23.878721299 +0000 UTC m=+1.400441217
	}
request 1 2020-10-21 16:54:24.470811399 +0000 UTC m=+0.200246254
request 2 2020-10-21 16:54:24.670758827 +0000 UTC m=+0.400193482
request 3 2020-10-21 16:54:24.871167288 +0000 UTC m=+0.600601913
request 4 2020-10-21 16:54:25.070775841 +0000 UTC m=+0.800210554
request 5 2020-10-21 16:54:25.270805827 +0000 UTC m=+1.000240505
request 1 2020-10-21 16:54:25.270854384 +0000 UTC m=+1.000289018
request 2 2020-10-21 16:54:25.270859646 +0000 UTC m=+1.000294273
request 3 2020-10-21 16:54:25.270863497 +0000 UTC m=+1.000298116
request 4 2020-10-21 16:54:25.470974975 +0000 UTC m=+1.200409608
request 5 2020-10-21 16:54:25.67116232 +0000 UTC m=+1.400596974
}
request 1 2020-10-21 16:54:26.271738531 +0000 UTC m=+0.200278269
request 2 2020-10-21 16:54:26.471727684 +0000 UTC m=+0.400267456
request 3 2020-10-21 16:54:26.671712201 +0000 UTC m=+0.600251980
request 4 2020-10-21 16:54:26.871703296 +0000 UTC m=+0.800243237
request 5 2020-10-21 16:54:27.071760433 +0000 UTC m=+1.000300158
request 1 2020-10-21 16:54:27.071817886 +0000 UTC m=+1.000357577
request 2 2020-10-21 16:54:27.071835043 +0000 UTC m=+1.000374733
request 3 2020-10-21 16:54:27.071840685 +0000 UTC m=+1.000380381
request 4 2020-10-21 16:54:27.271919949 +0000 UTC m=+1.200459667
request 5 2020-10-21 16:54:27.471947605 +0000 UTC m=+1.400487336
index