令牌桶算法和漏桶算法有什么区别_常用限流算法的应用场景和实现原理

本文介绍了在高并发场景下,限流算法的重要性,并详细讲解了计数器、滑动窗口、漏桶和令牌桶这四种常见的限流算法的思想、应用场景及代码实现。重点对比了令牌桶和漏桶算法,令牌桶更适合应对突发流量,而漏桶则适用于流量整形。
摘要由CSDN通过智能技术生成

158ef4d1ba2c70ffb6e2f920e14e1c34.png

在高并发业务场景下,保护系统时,常用的"三板斧"有:"熔断、降级和限流"。今天和大家谈谈常用的限流算法的几种实现方式,这里所说的限流并非是网关层面的限流,而是业务代码中的逻辑限流。

限流算法常用的几种实现方式有如下四种:

  • 计数器
  • 滑动窗口
  • 漏桶
  • 令牌桶

下面会展开说每种算法的实现原理和他们自身的缺陷,方便以后我们在实际应用中能够根据不同的情况选择正确的限流算法。

计数器

算法思想

计数器是一种比较简单粗暴的限流算法,其思想是在固定时间窗口内对请求进行计数,与阀值进行比较判断是否需要限流,一旦到了时间临界点,将计数器清零。

b9c58f2106055b61a9c953000a893385.png

面临的问题

计数器算法存在“时间临界点”缺陷。比如每一分钟限制100个请求,可以在00:00:00-00:00:58秒里面都没有请求,在00:00:59瞬间发送100个请求,这个对于计数器算法来是允许的,然后在00:01:00再次发送100个请求,意味着在短短1s内发送了200个请求,如果量更大呢,系统可能会承受不住瞬间流量,导致系统崩溃。(如下图所示)

5adff9639f84b963529f333c0c65742e.png

所以计数器算法实现限流的问题是没有办法应对突发流量,不过它的算法实现起来确实最简单的,下面给出一个用Go代码实现的计数器。

代码实现

type LimitRate struct {
   rate  int           //阀值
   begin time.Time     //计数开始时间
   cycle time.Duration //计数周期
   count int           //收到的请求数
   lock  sync.Mutex    //锁
}

func (limit *LimitRate) Allow() bool {
   limit.lock.Lock()
   defer limit.lock.Unlock()

   // 判断收到请求数是否达到阀值
   if limit.count == limit.rate-1 {
      now := time.Now()
      // 达到阀值后,判断是否是请求周期内
      if now.Sub(limit.begin) >= limit.cycle {
         limit.Reset(now)
         return true
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值