高并发应用利器-限流

93 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第 25 天,点击查看活动详情

1 前言

在高并发系统开发过程中有缓存、降级、限流等三大利器。缓存的目的就是提升系统访问速度,增大系统的处理能力,降级是为了屏蔽掉非核心应用以保证核心应用的不受影响,待流量高峰通过后在开放该功能。限流的目的就是通过对并发的访问量进行限速来保护系统,一旦达标准后则拒绝服务或者排队等待。从实践的角度来说,限流的作用更重要一些。

2 限流算法

目前常用的限流算法有: 计数器(滑动窗口)、令牌桶算法、漏斗算法。

  • 计数器算法

计数器算法非常简单,就是在一段时间内进行计数,通过对比阈值来判断请求是否达到了限流标准,计数器的算法很大的缺陷就是不能处理突发的流量,不过对简单的系统还是可以支持的。不过结束期算法也有其使用的场景,比如数据库连接池,redis 连接池,线程池等。

  • 令牌桶算法

令牌桶就是一个存放固定容量令牌的容器,按照固定的速率往桶中添加令牌,请求来临时需要从令牌桶中获取令牌才能访问资源,令牌不足则拒绝请求。

  • 漏桶算法

漏桶算法和令牌桶算法相反,请求按照固定的速率流出,流入桶的速度则不受限制。当漏桶的容量满了之后,就不会接受请求,开始拒绝请求。

3 令牌桶和漏桶对比

在常用的限流算法中,常用的就是令牌桶和漏桶算法,两者的对比如下所示:

  • 1 令牌桶按照固定速率向桶中添加令牌,请求是否能够被处理需要看桶中的令牌是否足够,当桶中令牌数量为 0 时则拒绝新的请求。

  • 2 漏桶则按固定的速率发起七情,进入桶中的请求速率是不固定的,当流入的请求达到漏桶的容量时,则拒绝新加入的请求。

  • 3 漏桶的限制流量流出的速率,而不限制流入的速率,从而平滑的应对突发的请求。

  • 4 令牌桶则是限制流入令牌的速率,在一定程度上允许突发的流量。漏桶则是平滑流入的速率。

  • 5 两个限流算法是雷速的,不过限流的方向是相反的。

4 总结

在本文中,主要介绍了几中常用的限流算法,在高并发系统中应用是很广泛的,在后续的文章中,将继续分享有关分布式系统的概念知识,欢迎大家关注。