限流或流控
限流或流控指得是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理。
流控中主要涉及到几种算法,即固定时间窗口限流算法、滑动时间窗口限流算法、漏桶算法和令牌桶算法。目前使用较多的还是漏桶算法和令牌桶算法,尤其是令牌桶算法。
(1)漏桶算法
漏桶算法(Leaky Bucket)是网络世界中流量整形(Traffic Shaping)或速率限制(Rate Limiting)时经常使用的一种算法,它的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。
如上图所示,把请求比作是水,水来了都先放进桶里,并以限定的速度出水,当水来得过猛而出水不够快时就会导致水直接溢出,即拒绝服务。漏桶算法能强行限制水流的速度。
简单来说,用户单位时间内请求量可以无限大,但是系统的处理请求的速度是固定的。当单位时间内的请求量到达一定量时,就会被拒绝。
(2)令牌桶算法
令牌桶算法是网络流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一种算法。典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送。
令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。
需要注意的是,令牌桶算法比漏桶算法更加灵活,令牌桶算法在一定条件下,能够支持突发流量的处理。
在令牌桶算法的一些具体实现库中,如Golang的time.rate库,就是基于令牌桶算法实现的限流器,在构造令牌桶时,会有两个参数,一个是limit,一个是burst,limit表示每秒往令牌桶的放入多少个Token,burst表示令牌桶的容量,也就是能应对的最大突发流量。
服务降级
简单来说,当服务A调用服务B,当服务B出现异常且达到一定的异常条件时,服务A干脆就调用一个类似于本地方法(也即备用方案)来代替服务B。
服务熔断
熔断就跟保险丝一样,当一个服务请求并发特别大,服务已经招架不住了,调用错误率飙升,当错误率达到一定阈值后,就将这个服务熔断了。熔断之后,后续的请求就不会再请求这个服务了。
Hystrix组件
目前Netflix公司的开源组件Hystrix就已经对服务降级和服务熔断有了很好的支持。
学习资料参考于:
https://www.infoq.cn/article/qg2tx8fyw5vt-f3hh673
https://www.jianshu.com/p/a59c13e70582
http://www.voidcn.com/article/p-nrrhpwdv-bob.html