限流一般需要结合容量规划和压测来进行。
当外部请求接近或者达到系统的最大阈值时,触发限流,采取其他的手段进行降级,保护系统不被压垮。
常见的降级策略包括延迟处理、拒绝服务、随机拒绝等。
计数器法:
- 将时间划分为固定的窗口大小,例如1s
- 在窗口时间段内,每来一个请求,对计数器加1。
- 当计数器达到设定限制后,该窗口时间内的之后的请求都被丢弃处理。
- 该窗口时间结束后,计数器清零,从新开始计数。
滑动窗口计数法:
- 将时间划分为细粒度的区间,每个区间维持一个计数器,每进入一个请求则将计数器加一。
- 多个区间组成一个时间窗口,每流逝一个区间时间后,则抛弃最老的一个区间,纳入新区间。
- 若当前窗口的区间计数器总和超过设定的限制数量,则本窗口内的后续请求都被丢弃。
漏桶算法:
如果外部请求超出当前阈值,则会在容易里积蓄,一直到溢出,系统并不关心溢出的流量。
从出口处限制请求速率,并不存在计数器法的临界问题,请求曲线始终是平滑的。
无法应对突发流量,相当于一个空桶+固定处理线程
令牌桶算法:
假设一个大小恒定的桶,这个桶的容量和设定的阈值有关,桶里放着很多令牌,通过一个固定的速率,往里边放入令牌,如果桶满了,就把令牌丢掉,最后桶中可以保存的最大令牌数永远不会超过桶的大小。
当有请求进入时,就尝试从桶里取走一个令牌,如果桶里是空的,那么这个请求就会被拒绝。
© 版权声明
本站文章由不念博客原创,未经允许严禁转载!
THE END