速率限制(英) 是一个重要的控制服务资源利用和质量的途径。Go 通过 Go 协程、通道和打点器优美的支持了速率限制。
Example:
package main import "fmt" import "time" func main() { //首先我们将看一下基本的速率限制。 //假设我们想限制我们接收请求的处理,我们将这些请求发送给一个相同的通道。 requests := make(chan int, 5) for i:=1; i<=5; i++{ requests <- i } close(requests) //这个 limiter 通道将每 200ms 接收一个值。 //这个是速率限制任务中的管理器。 limter := time.Tick(time.Millisecond * 200) //通过<- limter在每次请求前阻塞 limiter 通道的一个接收 //我们限制自己每 200ms 执行一次请求。 for j:=1; j<=5; j++{ <- limter fmt.Println("request", j, time.Now()) } }
Result:
$ go run example.go request 1 2019-10-30 09:16:22.3579116 +0800 CST m=+0.209001001 request 2 2019-10-30 09:16:22.5589099 +0800 CST m=+0.409999301 request 3 2019-10-30 09:16:22.7591482 +0800 CST m=+0.610237601 request 4 2019-10-30 09:16:22.9575729 +0800 CST m=+0.808662301 request 5 2019-10-30 09:16:23.15802 +0800 CST m=+1.009109401
运行程序,我们看到第一批请求意料之中的大约每 200ms 处理一次。