常用限流策略之漏桶和令牌桶

常用限流策略之漏桶和令牌桶

一、限流场景以及策略

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
}

漏桶在这里暂时不讲解

如果看完对自己有所帮助,请点赞支持,谢谢大家

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值