Go公式WikiのRate Limitingの日本語意訳になります。
(元記事の最終更新日: 2016/04/22 rev.8)
レート制限についての例が載っています。
レート制限
単位時間あたりの操作をレート制限するには、time.Tickerを使用してください。
これは1秒あたり数十件のレートで有効です。
より高いレートになる場合は、golang.org/x/time/rate.Limiterのようなトークンバケット方式のレート制限が効果的です。(godoc.orgをレート制限で検索してみてください)
import "time"
rate := time.Second / 10
throttle := time.Tick(rate)
for req := range requests {
<-throttle // Service.Method RPCのレート制限を実行
go client.Call("Service.Method", req, ...)
}
バーストを許可するなら、スロットルにバッファを追加します。
import "time"
rate := time.Second / 10
burstLimit := 100
tick := time.NewTicker(rate)
defer tick.Stop()
throttle := make(chan time.Time, burstLimit)
go func() {
for t := range tick.C {
select {
case throttle <- t:
default:
}
} // tick.Stop() の後に終了
}()
for req := range requests {
<-throttle // Service.Method RPCのレート制限を実行
go client.Call("Service.Method", req, ...)
}
comments powered by Disqus