服务限流 应当是每个并发程序都应该考虑的~!限流的目的不仅是为了控制访问的总并发量,而且还要尽量让访问的流量来的更均衡,这样才不会让系统的负载大起大落,因此又称为"流量整形"。
当然在微服务盛行的时代,我们考虑到的 服务限流 不再单单应对 单体服务 ,而是更要清楚分布式场景下如何进行 服限流
一丶单体限流
以上三种是我们在 单体服务 中常见的限流算法,我们接下来分别认识一下!
1、计数器限流
计数器限流 是属于一种比较简单粗暴的方式!
设计思路如下:
我们会限制一秒钟内能够通过的请求数(比如 50),从第一个请求进来开始计数,在接下去的1s 内,每进来一个请求,我们就会把计数值加 1,如果累加的数字达到了 50,那么后续的请求就会被全部拒绝,等到 1s 过去之后,把计数恢复成 0,并重新开始计数
使用计数器可以用来限制一定时间内的总并发数,但说到底这是一种简单粗暴的限流方式,而不是平均速率限流,在某些场景下可以使用。但是遇到某些特殊的情况下,如果系统的负载量只有 50,在第59秒瞬间请求 50 次,并且在第 1:00 也请求了 50次,那么这个程序在 1 秒内被请求了 100次,瞬间超过总负载,很有可能直接击垮我们的应用程序!
当然,事情都没有绝对的,我们可以使用 滑动窗口 的方式解决问题。说到 滑动窗口有些小伙伴并不陌生,因为 TCP 协议 就有采用 滑动窗口来控制流量,不清楚的小伙伴往下看!
滑动窗口算法指的是以当前时间为截止时间,往前取一定的时间,比如取 60 秒时间,在这 60秒之内运行的最大访问数为 50,此时算法的执行逻辑为:先清除 60 秒之前的所有请求记录,再计算当前集合内请求数量是否大于设定的最大请求数 50?如果大于则执行限流拒绝策略,否则插入本次请求记录并执行正常流程。