参考
先看这2个文章。
本文的重要目的是,讲滑动时间窗口。
示意图
固定时间窗口
滑动时间窗口
核心
算法有2个核心数据 1.时间 1s 2.次数 100次
也就是说,100次/s。
固定时间窗口
第一个1s的结束250ms,100次请求。第二个1s的开始250ms,100次请求。
因为你的机器现在只能承受100次请求/s,所以一下子来200个请求,而且是在同一秒内。比如上面的这种情况,实际上是500ms内,承受了200次请求,这个时候机器就挂了。怎么办?
首先,我们要明白我们的目的,我们的目的是不要让机器挂掉,但是可以舍弃部分请求。怎么做?
比如,我们让刚才那种情况的500ms内的前250ms的100次请求,正常。后250ms的100请求,丢弃。//能解决这个问题,即实现了这个,就是滑动时间窗口算法。
滑动时间窗口
看示意图。
假设总共就只有200次请求,第一个1s的最后250ms,100次。第二个1s的开始250ms,100次。现在: 第一个1s,100次请求,正常。
101次请求,这个时候,实际上如果按固定时间窗口的话,那么是可以正常请求的,因为在第二个1s,计数器次数归0,所以可以继续请求。但是问题是,这样会导致机器挂掉。怎么办?
滑动时间窗口, 就是当101次请求,请求时间大于第一个1s,这个时候,第二个1s不是从第一个1s结束的时候开始,而是从第一个1s的第一个小时间段开始,具体看示意图。
那么这个时候,101次请求,仍然在第二个1s里,但是第二个1s的计数器没有归0,而是100。所以,时间是在第二个1s,但是次数超过了计数器,那么丢弃。所以,后面的100个请求,都和101次请求一样,都被丢弃。最终,机器没有被压垮,只是丢弃了部分请求。这就是限流。
限流,就是保证机器不被压垮。就是确保服务器自己只能处理自己最大能力的请求数量,超过的就丢弃,而不是被压垮,导致一个请求都处理不了。
到底什么是限流?
不限流,请求会一直到来。直到把机器搞垮。
限流之后,超过限流的请求,拒绝服务。具体怎么做?请求来的时候,校验,不满足,就直接返回,说你已经限流。实际上就是在后台,丢弃了请求,即没有处理请求,虽然接受了请求。因为发送请求,是客户端做的,这个限制不了。除非客户端的代码是你自己的,那也可以在客户端按时间来限流。
压垮系统,有什么后果?
系统就完全卡死,无法响应任何请求。//本来是可以处理自己能力的请求,不能处理的丢弃。如果不解决丢弃的问题,那么会导致一个请求都处理不了。解决丢弃,就是限流。