秋招Day19 - 分布式 - 限流

了解哪些限流算法?

计数器

计数器比较简单粗暴,比如我们要限制 1s 能够通过的请求数,实现的思路就是从第一个请求进来开始计时,在接下来的 1s 内,每个请求进来请求数就**+1**,超过最大请求数的请求会被拒绝,等到 1s 结束后计数清零,重新开始计数。

这种方式有个很大的弊端:在一个极短的时间内(例如,从 999 毫秒到 1001 毫秒这 2 毫秒里),系统可能实际处理了 100(第 0 秒末尾) + 100(第 1 秒开头) = 200 个请求。这远远超出了我们预期的"每秒 100 个请求"的限制。这种现象叫做"突刺现象"。

漏桶算法

就是桶底出水的速度恒定,进水的速度可能快慢不一,但是当进水量大于出水量的时候,水会被装在桶里,不会直接被丢弃;但是桶也是有容量限制的,当桶装满水后溢出的部分还是会被丢弃的。

算法实现:可以准备一个队列来保存暂时处理不了的请求,然后通过一个线程池定期从队列中获取请求来执行。

令牌桶算法

令牌桶就是生产访问令牌的一个地方,生产的速度恒定,用户访问的时候当桶中有令牌时就可以访问,否则将触发限流。