基于令牌桶算法和漏桶算法来实现的限速限流,Golang实现。
漏桶算法思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水,当水流入速度过大会直接溢出,可以看出漏桶算法能强行限制数据的传输速率。
漏桶算法示意图
漏桶算法可以很好地限制容量池的大小,从而防止流量暴增。
令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。
令牌桶算法示意图
令牌桶算法通过发放令牌,根据令牌的rate频率做请求频率限制,容量限制等。
package main
import (
"log"
"time"
"github.com/yangwenmai/ratelimit/leakybucket"
"github.com/yangwenmai/ratelimit/simpleratelimit"
)
func main() {
// rate limit: simple
rl := simpleratelimit.New(10, time.Second)
for i := 0; i < 100; i++ {
log.Printf("limit result: %v\n", rl.Limit())
}
log.Printf("limit result: %v\n", rl.Limit())
// rate limit: leaky-bucket
lb := leakybucket.New()
b, err := lb.Create("leaky_bucket", 10, time.Second)
if err != nil {
log.Println(err)
}
log.Printf("bucket capacity:%v", b.Capacity())
// rate limit: token-bucket
}