Rate limiting
Limiting the rate of requests for a resource is important to maintain a predictable quality of service. There are several ways rate control can be achieved. We will study two implementations of the same algorithm. The first one is a relatively simple implementation of the token bucket algorithm that uses channels, a ticker, and a goroutine. Then, we will study a more advanced implementation that requires fewer resources.
First, let’s take a look at the token bucket algorithm and show how it is used for rate limiting. Imagine a fixed-sized bucket containing tokens. There is a producer process that deposits tokens into this bucket at a fixed rate, say two tokens/second. Every 500 milliseconds, this process adds a token to the bucket if the bucket has empty slots. If the bucket is full, it waits for another 500 milliseconds and checks the bucket again. There is also a consumer process that consumes tokens at random intervals. However, in order for the consumer...