熔断、限流和降级
熔断
为什么需要熔断?
在分布式系统中,如果下游服务出现问题,我们的服务依然去不断的请求,会带来以下两个问题:一是会增加整个链路的请求时间(如果我们设置了调用超时,则每个请求都会达到超时时间),二是下游的问题会导致我们的项目出现大量超时,进而引发整个系统的崩溃。
熔断的作用?
- 防止应用程序不断的尝试可能超时或不可用的服务
- 熔断器通常具有自我诊断下游系统是否修正的能力,容端器的开启、关闭、半开启
市面产品:阿里的Sentinel,Netflix的Hystrix
降级
降级主要解决系统资源不足和访问量增加的矛盾,为了让系统抗住大量的请求,而对功能做出一些牺牲。通常适用于一些兜底逻辑。比如发生熔断时降级为其他服务。典型的就是“弃车保帅”
限流
对并发访问的量进行一定的限制。
限流的方式
- 拒绝服务。
- 服务降级。
- 延时处理。
限流的实现方式
- 时间窗口:维护一个时间窗口,统计窗口内的请求数量。可用Redis的zset实现
- 漏斗:可以用一个队列实现,当队列满了拒绝请求。可用Redis的redis-cell实现
- 令牌桶:和漏斗很相似,区别在于引入一个中间人来生成令牌,请求在进行处理时要先获得令牌。可用Guava的RateLimiter实现