标题何为限流?为什么要限流?
针对软件系统来说,限流就是对请求进行限制,避免瞬时大量的请求击垮软件系统。
常见限流算法
固定窗口计数器算法
例如我们规定某个接口每分钟访问的次数
- 给定一个变量counter 记录当前接口处理次数 初始值为0(表示还没开始处理请求)
- 一分钟后每处理一个请求 counter+1,当counter 等于我们想设置的次数后,之后的访问全部拒绝
- 一分钟结束后 将counter 重置为0,重新开始计数
这种限流算法无法保证限流速率,因而无法保证突然激增的流量。
就比如说我们限制某个接口 1 分钟只能访问 1000 次,该接口的 QPS 为 500,前 55s 这个接口 1 个请求没有接收,后 1s 突然接收了 1000 个请求。然后,在当前场景下,这 1000 个请求在 1s 内是没办法被处理的,系统直接就被瞬时的大量请求给击垮了。
标题滑动窗口计数器算法
相当于固定窗口的升级版,就说对时间以一定比例分片 每一秒处理多少次请求 60(请求数)/60(窗口数)超过限制不再处理其他请求
漏桶算法
桶装多少水是固定的 可以准备一个队列保存请求,定期从队列中拿请求,就是把请求比作水滴,水滴满了,其他请求就进不来了,然后开始把水滴漏掉,就是消费水滴
令牌桶算法
和漏桶算法一样,就说请求被处理之前拿到一个令牌,请求处理完毕把这个令牌丢弃(删除)我们根据限流大小,按照一定的速率往桶里添加令牌。如果桶装满了,就不能继续往里面继续添加令牌了。