后端:如何理解限流? | 青训营笔记

48 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

近些年来,电商的发展速度越来越快,随着服务的升级,服务的稳定性愈发重要。在遇到突发的请求量激增,恶意的用户访问,亦或请求频率过高给下游服务带来较大压力时,通常需要应对流量高峰,在高并发场景下,解决的的方法大致包括限流、熔断、降级。

限流是限制到达系统的并发请求数量,保证系统能够正常响应部分用户请求,而对于超过限制的流量,则通过拒绝服务的方式保证整体系统的可用性。

  • 根据限流作用范围,可以分为单机限流和分布式限流
  • 根据限流方式,又分为计数器、滑动窗口、漏桶限令牌桶限流

关于限流方式的简单分析如下:

计数器

在一定时间内,对请求数量进行计数,对于超过数量范围的请求拒绝。

优点 :简单,易于实现

缺点 :不能很好的处理时间边界问题,而且使用的锁也比较浪费时间

滑动窗口

滑动窗口针对的是计数器存在的时间临界点问题。

将一个大的时间段截为若干个小的时间窗口,每一个窗口看做单独的计数器,所有的计数器加起来的是一个大的计数器,虽然并不能完全解决临界点缺陷,但是大大降低了流量高峰的风险。

  • 优点:稍微处理了时间临界点问题
  • 缺点:实现稍微复杂,还是不能彻底解决“计数器”存在时间的边界问题,对于更精准的情况仍然存在缺陷

漏桶

流入的请求可以随便的速率,但是流出的水的速率是固定的

  • 优点:可以很好的控制请求处理的频率;
  • 缺点:实现稍微复杂,单位时间内,不能多消费。

漏桶限制的是常量流出速率(即流出速率是一个固定常量值),所以最大的速率就是出水的速率,不能出现突发流量。

令牌桶

对漏桶的升级算法,令牌桶算法(Token Bucket)是最常使用的一种算法。典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送

  • 优点:可以解决“漏桶”不能灵活消费的问题,又能避免过渡消费
  • 缺点:实现稍微复杂

令牌桶限制的是平均流入速率(允许突发请求),并允许一定程度突发流量,所以也是非常常用的限流算法。