微服务稳定性稳定性三大杀器,缓存,队列,限流降级。这一部分讲一下限流降级。每个系统都有自己的最大服务能力,即在达到某个临界点之前,系统都可以正常提供服务。为了保证系统在面临瞬间的流量时仍然可以对外提供服务,我们就需要使用限流技术。下面就讲一讲笔者认为的降级和熔断的概念。
限流:1)服务的入口的限流,在流量激增的情况下对流量进行控制;2)当然还有一个情况就是,服务A在调用B,下游服务B只能抗住100的qps,在B服务不可用的情况下,需要限流,并进行熔断和降级(A调用B的出口返回默认的值);
熔断:一般是某个服务故障或者异常引起,类似现实世界中的"保险丝",当某个异常条件被触发,直接熔断整个服务,而不是一直等到此服务超时。
降级:当某个服务熔断之后,服务器将不再被调用,此时客户端自己准备一个本地的fallback回调,返回一个缺省值。虽然服务水平下降,但好歹可用。
限流算法
常见的限流算法有计数器算法、漏桶算法和令牌桶算法。
·计数器算法
计数器算法“简单粗暴”。该算法会维护一个counter,规定在单位时间内counter的大小不能超过最大值,每相隔固定时间就将counter的值置零。如果这个counter大于设定的阈值,系统开始拒绝请求以保护系统的负载。
·漏桶算法
在漏桶算法中,我们会维护一个固定容量的桶,这个桶会按照指定的速度漏水。如果这个桶空了,那么就停止漏水;请求到达系统就类似于将水加入桶中,这个速度可以是均匀的也可以是瞬间的,如果桶满了,就忽略后面的请求,这倒这个桶可以存放多余的水。优点:将系统的处理能力维持在一个比较平稳的水平;缺点:在瞬间流量过来时,会拒绝后续的请求流量。代码中会通过一个队列来实现漏斗的效果,当请求过多时,队列中的请求就开始积压,当队列满了之后,系统就会开始拒绝请求。
·令牌桶算法
令牌桶的思路是,随着时间的流逝,系统会按照指定速度往桶里添加token,每来一个新请求,就从桶里拿走一个token,如果没有token可以拿就拒绝服务。这种算法的好处是便于控制系统的处理速度,甚至可以通过统计信息实时优化令牌桶的大小。
令牌桶算法和漏桶算法的不同之处在于处理瞬间到达的大流量不同:令牌桶算法由于在令牌桶里攒了很多令牌,因此在大流量到达的瞬间可以一次性将队列中所有的请求都处理完,然后按照恒定的速度处理请求;漏桶算法则一直有一个恒定的阈值,在大流量到达的时候,也会将多余的请求拒绝。
Author:忆之独秀
Email:leaguenew@qq.com
注明出处:https://blog.csdn.net/lavorange/article/details/95681138