限流策略
固定窗口
对一段时间固定内的请求进行计数,如果请求数量超过阈值就抛弃,如果没有达到这个阈值就接受这个请求
算法简单,但是有流量突刺现象
滑动窗口
在一个固定窗口的基础上,将一个计时窗口分成了若干个小窗口,然后每个小窗口维护一个独立的计时器,当请求的时候大于当前窗口的最大时间,则会将计时窗口向前平移一个小窗口,平移的时候会将第一个小窗口的数据丢弃,然后将第二个小窗口设置成第一个小窗口并在最前面新增一个小窗口。
同时也需要满足所有小窗口的请求数量不能超过阈值
相比固定窗口,可以有效的平衡流量突刺
漏桶
请求来了之后会首先进入漏桶中,然后漏桶以恒定的速率将请求流出以处理,从而去起到一个平滑流量的作用,当请求流量过大的时候,漏桶达到最大容量就会溢出
可以应对突发流量,但是不能应对短时间的大流量
令牌桶
对漏桶算法的一种改进,除了可以起到限流作用以外,还允许一定程序上的流量突发。在令牌桶的算法中有一个令牌桶,算法中存在一个机制,可以恒定地向令牌桶中放入令牌,令牌桶也有一定的容量,如果满了令牌就放不进去。当请求来的时候,首先会去令牌桶拿令牌。如果可以拿到令牌说明请求可以被处理并消耗拿到的令牌数量。否则被丢弃
允许一定程序的突发流量,当有大量的请求流入的时候,可以使用堆积的令牌去处理
与滑动窗口算法的区别:
- 滑动窗口关注的是单位时间内的总请求量
- 令牌桶算法关注的是请求的平均速率
- 令牌桶可以应对短时间内的突发流量,而滑动窗口只是对突发流量进行一个限制
- 如果系统对突刺的容忍度较高,选择令牌桶算法;如果希望更加平滑选择滑动窗口算法
- 漏桶能够强行限制数据的传输速率,而令牌桶在能够限制数据的平均传输速率外,还允许某种程度的突发传输。 在“令牌桶算法”中,只要令牌桶中存在令牌,那么就允许突发地传输数据直到达到用户配置的门限,因此它适合于具有突发特性的流量
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 cloud_fly blog!