1

限流算法

 2 years ago
source link: https://wakzz.cn/2018/12/10/nginx/%E9%99%90%E6%B5%81%E7%AE%97%E6%B3%95/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

限流目的是通过对并发访问/请求进行限速或者一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或者等待、降级。

常见的限流算法有:令牌桶算法、漏桶算法、计数器算法。

1、令牌桶算法

令牌桶算法是一个存放固定容量令牌的桶,按照固定速率往桶里添加令牌。

  • 假设限制2r/s,则每500毫秒向桶中添加令牌
  • 桶总最多存放b个令牌,当桶满时,新添加的令牌被丢弃或者拒绝
  • 当一个n字节的请求到达,将从桶中删除n个令牌,接着请求被放行
  • 如果桶中的令牌不足n个,则不会删除令牌,且该请求将被限速(被丢弃或在缓冲区等待)

2、漏桶算法

漏桶算法非常简单。

  • 一个固定容器的漏桶,按照固定速率放行请求
  • 请求可以以任意速率请求到漏桶
  • 如果请求超出桶的容量,则请求将被限速(被丢弃)

3、计数器算法

计数器主要用来限制总并发数,只要全局总请求数或者一定时间段的总请求数达到设定的阈值,则进行限速。该算法是一种简单粗暴的总数量限流,而不是平均速率限流。

  • 令牌桶是按照固定速率往桶中添加令牌,请求是否被处理需要看桶中令牌是否足够,当令牌数减至0时,则拒绝新的请求
  • 漏桶则是按照固定速率流出请求,流入请求速率任意,当流入的请求数累积到漏桶容量时,则新流入的请求被拒绝
  • 令牌桶限制的是平均速率(允许突发请求),并允许一定程度的突发流量
  • 漏桶限制的是流出速率,从而平滑突发请求
  • 令牌桶和漏桶算法实现可以一样,但是方向是相反的,对于相同参数得到的流速效果一样
  • 计数器算法是总数量限流,令牌桶和漏桶都是平均速率限流

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK