限流和限流算法

导读:本篇文章讲解 限流和限流算法,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

目录

一 什么是限流

二 为什么需要限流

三 那些场景需要用到限流

3.1 对外服务

3.2 对内服务

四 限流算法

4.1 计数器算法

4.2 漏桶算法

4.3 令牌桶算法


一 什么是限流

       限流其实是指当系统资源不够,不足以应对大量请求,即系统资源与访问量出现矛盾的时候,我们为了保证有限的资源能够正常服务,因此对系统按照预设的规则进行流量限制或功能限制的一种方法。

二 为什么需要限流

      一旦流量过大,为了保证服务可用,所以需要限流。

三 那些场景需要用到限流

3.1 对外服务

  • 业务用户量的不断增加
  • 各种营销、促销类活动
  • 网络爬虫
  • 恶意刷单

       这些情况都是无法预知的,不知道什么时候会有10倍甚至20倍的流量打进来,如果真碰上这种情况,扩容是根本来不及的。所以需要限流。

3.2 对内服务

       对内的中台服务 Z 被各种服务 G、H、P、B 共同调用,一旦 G 出现流量陡增的情况,很容易将中台服务 Z 打挂。所以中台服务 Z 需要对调用方进行限流。

四 限流算法

4.1 计数器算法

       采用计数器实现限流有点简单粗暴,一般我们会限制一秒钟的能够通过的请求数,比如限流 qps 为100,算法的实现思路就是从第一个请求进来开始计时,在接下去的1s内,每来一个请求,就把计数加1,如果累加的数字达到了100,那么后续的请求就会被全部拒绝。等到1s结束后,把计数恢复成0,重新开始计数。

       具体的实现可以是这样的:对于每次服务调用,可以通过 AtomicLong#incrementAndGet()方法来给计数器加1并返回最新值,通过这个最新值和阈值进行比较。

       这种实现方式,相信大家都知道有一个弊端:如果我在单位时间1s内的前10ms,已经通过了100个请求,那后面的990ms,只能眼巴巴的把请求拒绝,我们把这种现象称为“突刺现象”。

4.2 漏桶算法

       漏桶算法的原理比较简单,水(请求)先进入到漏桶里,人为设置一个最大出水速率,漏桶以<=最大出水速率的速度出水,当水流入速度过大会直接溢出(拒绝服务):

限流和限流算法

因此,这个算法的核心为:

  • 存下请求
  • 匀速处理
  • 多于丢弃

因此这是一种强行限制请求速率的方式,但是缺点非常明显,主要有两点:

  • 无法面对突发的大流量—-比如请求处理速率为1000,容量为5000,来了一波2000/s的请求持续10s,那么后5s的请求将全部直接被丢弃,服务器拒绝服务,但是实际上网络中突发一波大流量尤其是短时间的大流量是非常正常的,超过容量就拒绝,非常简单粗暴。
  • 无法有效利用网络资源—-比如虽然服务器的处理能力是1000/s,但这不是绝对的,这个1000只是一个宏观服务器处理能力的数字,实际上一共5秒,每秒请求量分别为1200、1300、1200、500、800,平均下来qps也是1000/s,但是这个量对服务器来说完全是可以接受的,但是因为限制了速率是1000/s,因此前面的三秒,每秒只能处理掉1000个请求而一共打回了700个请求,白白浪费了服务器资源。

所以,通常来说利用漏桶算法来限流,实际场景下用得不多。

4.3 令牌桶算法

       令牌桶算法是网络流量整形(Traffic Shaping)和限流(Rate Limiting)中最常使用的一种算法,它可用于控制发送到网络上数据的数量并允许突发数据的发送。

       从某种意义上来说,令牌桶算法是对漏桶算法的一种改进,主要在于令牌桶算法能够在限制调用的平均速率的同时还允许一定程度的突发调用,来看下令牌桶算法的实现原理:

限流和限流算法

整个的过程是这样的:

  • 系统以恒定的速率产生令牌,然后将令牌放入令牌桶中;
  • 令牌桶有一个容量,当令牌桶满了的时候,再向其中放入的令牌就会被丢弃;
  • 每次一个请求过来,需要从令牌桶中获取一个令牌,假设有令牌,那么提供服务;假设没有令牌,那么拒绝服务。

       那么,我们再看一下,为什么令牌桶算法可以防止一定程度的突发流量呢?可以这么理解,假设我们想要的速率是1000QPS,那么往桶中放令牌的速度就是1000个/s,假设第1秒只有800个请求,那意味着第2秒可以容许1200个请求,这就是一定程度突发流量的意思,反之我们看漏桶算法,第一秒只有800个请求,那么全部放过,第二秒这1200个请求将会被打回200个。

       注意上面多次提到一定程度这四个字,这也是我认为令牌桶算法最需要注意的一个点。假设还是1000QPS的速率,那么5秒钟放1000个令牌,第1秒钟800个请求过来,第2~4秒没有请求,那么按照令牌桶算法,第5秒钟可以接受4200个请求,但是实际上这已经远远超出了系统的承载能力,因此使用令牌桶算法特别注意设置桶中令牌的上限即可。

       总而言之,作为对漏桶算法的改进,令牌桶算法在限流场景下被使用更加广泛。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/9585.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!