Go Rate Limiting (Japanese)

"Rate Limiting" from golang wiki

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