熔断:

生活中的一个最形象的例子,就是保险丝,可以在短路的时候自动跳闸,保护家电

在分布式系统中的熔断,也可以保护我们的系统

分布式系统中,一个上游服务,可能调用多个下游服务。比如一个购物模服务,需要调用订单服务,支付服务,统计服务等等等

如果下游服务出现了故障,上游服务还是继续访问的话,就可能回出现请求无法被解决,被堆积的情况

更坏的情况是,一条调用链路,A->B->C->D->E->F->G,如果G出现故障,上游服务调用它会出现等待超时的情况,这时候如果没有一个好的措施,那么就会导致这个服务链路雪崩,从一个服务的故障演化为整个系统的故障

这时候就是熔断上场的好时候,熔断器可以防止服务不断的去尝试下游可能超时或失败的服务,即时断开这条链路,并且保护下游服务变得更坏

并且熔断器还可以让服务自动诊断下游服务是否已经修复,如果还未修复,依然保持熔断状态,如果已经修复,慢慢的放量请求,增加请求次数直到恢复故障前的状态

降级:

降级解决的是(系统资源 < 请求量)

如何在资源有限的情况下,扛住海量的请求(弃卒保帅)

这个场景在双十一就能看到,为了保证秒杀,购物,支付等业务正常进行,会禁用一些服务,降低图片的清晰度等等

三大措施:

  • 强一致性->最终一致性
  • 次要功能禁用
  • 简化功能流程

限流:

限制请求的数量,限制某段时间内的请求总量

对于超出的总量的请求,可以直接拒绝,也可以在请求的时候对请求分组,允许特殊请求进来,剩下的拒绝,也可以放入消息队列,削峰填谷

限流的实现方式:

  • 计数器:维护一个counter,每个时间段清零,对时间段内的请求进行计数,计数前判断counter是否达到阙值,如果没有就加一,达到则拒绝
  • 漏斗算法:一个固定容量的桶,当桶为空的时候,不会漏出水滴,流入桶的水的速率是任意的,漏出水的速率是固定的,如果流入桶的水超出桶的容量,进行拒绝

一般的实现方法是队列,队列模拟漏斗,空的时候不再出队,满的时候拒绝

  • 令牌桶算法:和漏斗算法很类似,不过除了一个队列以外,还加入了一个中间人,它会以一定的速率发放令牌(token)到桶内,队列中的的等待着只有拿到token才能通过

漏斗限制了传输速率,而令牌桶在限制的同时,还允许突然的大流量,即:在大流量到来的时候,有足够空间的情况下(足够的队列和桶内有足够的令牌),就允许进入

熔断强调服务间的调用

限流在流量入口作限制

降级从服务本身或者整个系统服务情况来考量

熔断是降级方式的一种,将情况不对的服务降级

降级又是限流的一种方式,降级限制当前服务的流量,以防止更大的损失

三者都是为了通过一定的方式去保护流量过大时(对于服务本身错误的情况。一点点流量也是“流量过大”),保护系统的手段