常用限流策略之漏桶和令牌桶
一、限流场景以及策略
1、场景
限流又称为流量控制,通常是指限制到达系统的并发请求数。比如电商系统的秒杀,微博上的突发热点新闻,双十一购物节,12306抢票等等,需要加上限制,虽然影响部分用户的体验,但是系统不至于崩溃。
2、策略
(1)漏桶算法介绍
漏桶法限流很好理解,假设我们有一个水桶按固定的速率向下方滴落一滴水,无论有多少请求,请求的速率有多大,都按照固定的速率流出,对应到系统中就是按照固定的速率处理请求。
缺点:不能处理突发情况(突然大量数据涌入,具有时效性的数据(比如抢购))
(2)令牌桶
和漏桶处理相似,首先按照固定速率将令牌放入令牌桶(可以堆积),拿到令牌的就可以通过,当遇到突发的状况,大量的数据涌入的时候,可以先取堆积的令牌通过,当令牌桶没有令牌的时候,可以继续等待放入令牌,也可以直接响应返回无效。
二、令牌桶的使用
1、定义中间件
func RateLimitMiddleware(fillInterval time.Duration, cap int64) func(c *gin.Context) {
bucket := ratelimit.NewBucket(fillInterval, cap)
return func(c *gin.Context) {
if bucket.TakeAvailable(1) < 1 {
c.String(http.StatusOK, "rate limit...")
c.Abort()
return
}
c.Next()
}
}
注:第一个参数是多少时间放令牌,第二个参数是放多少个令牌
2、将中间件放在路由中
package router
import (
"Ratelimit/controller"
"Ratelimit/middleWare"
"github.com/gin-gonic/gin"
"time"
)
func InitRouter()*gin.Engine{
r:=gin.New()
r.Use(middleWare.RateLimitMiddleware(2*time.Second,1))
r.GET("/ping",controller.PingHandler)
return r
}
漏桶在这里暂时不讲解
如果看完对自己有所帮助,请点赞支持,谢谢大家