字节三面的场景题
限流的目的是通过对于并发访问进行限速,一般是达到限制的速率,就会触发相应的限流行为。常见的限流行为如下:
- 拒绝服务。 把多出来的请求拒绝掉,受到流量暴增的时候,会统计当前的哪个客户端来的请求最多,直接进行拒绝,把带恶意的请求阻挡。
- 服务降级。关闭一些不太重要的服务,让给更重要的功能。另一种是返回部分数据。
- 特权请求。我们只把有限的资源分给重要的用户,我们应该把资源尽可能的分给特权用户。
- 延时队列。利用一个队列来进行缓冲大量的请求,如果队列满,则进行拒绝,一般用于应对短暂的峰刺请求。
限流的实现算法
计数器方式
最简单的算法是维护一个计数器,当请求来临的时候,做加一操作,当一个请求处理完后做减一操作。当计数器大于某个数,进行拒绝请求。
这种算法虽然实现简单,但是却有一个很大的缺陷:无法限制短时间之内的集中流量。假如我们需要限制每秒只能处理10个请求,如果该秒产生的请求都集中在最后10毫秒中,而下一秒钟的前10毫秒产生了10刺请求,那么在这20毫秒中产生了20次请求,因为这20 次请求分布在两个时间窗口内,所以没有触发限流。