熔断:
生活中的一个最形象的例子,就是保险丝,可以在短路的时候自动跳闸,保护家电
在分布式系统中的熔断,也可以保护我们的系统
分布式系统中,一个上游服务,可能调用多个下游服务。比如一个购物模服务,需要调用订单服务,支付服务,统计服务等等等
如果下游服务出现了故障,上游服务还是继续访问的话,就可能回出现请求无法被解决,被堆积的情况
更坏的情况是,一条调用链路,A->B->C->D->E->F->G,如果G出现故障,上游服务调用它会出现等待超时的情况,这时候如果没有一个好的措施,那么就会导致这个服务链路雪崩,从一个服务的故障演化为整个系统的故障
这时候就是熔断上场的好时候,熔断器可以防止服务不断的去尝试下游可能超时或失败的服务,即时断开这条链路,并且保护下游服务变得更坏
并且熔断器还可以让服务自动诊断下游服务是否已经修复,如果还未修复,依然保持熔断状态,如果已经修复,慢慢的放量请求,增加请求次数直到恢复故障前的状态
降级:
降级解决的是(系统资源 < 请求量)
如何在资源有限的情况下,扛住海量的请求(弃卒保帅)
这个场景在双十一就能看到,为了保证秒杀,购物,支付等业务正常进行,会禁用一些服务,降低图片的清晰度等等
三大措施:
- 强一致性->最终一致性
- 次要功能禁用
- 简化功能流程
限流:
限制请求的数量,限制某段时间内的请求总量
对于超出的总量的请求,可以直接拒绝,也可以在请求的时候对请求分组,允许特殊请求进来,剩下的拒绝,也可以放入消息队列,削峰填谷
限流的实现方式:
- 计数器:维护一个counter,每个时间段清零,对时间段内的请求进行计数,计数前判断counter是否达到阙值,如果没有就加一,达到则拒绝
- 漏斗算法:一个固定容量的桶,当桶为空的时候,不会漏出水滴,流入桶的水的速率是任意的,漏出水的速率是固定的,如果流入桶的水超出桶的容量,进行拒绝
一般的实现方法是队列,队列模拟漏斗,空的时候不再出队,满的时候拒绝
- 令牌桶算法:和漏斗算法很类似,不过除了一个队列以外,还加入了一个中间人,它会以一定的速率发放令牌(token)到桶内,队列中的的等待着只有拿到token才能通过
漏斗限制了传输速率,而令牌桶在限制的同时,还允许突然的大流量,即:在大流量到来的时候,有足够空间的情况下(足够的队列和桶内有足够的令牌),就允许进入
熔断强调服务间的调用
限流在流量入口作限制
降级从服务本身或者整个系统服务情况来考量
熔断是降级方式的一种,将情况不对的服务降级
降级又是限流的一种方式,降级限制当前服务的流量,以防止更大的损失
三者都是为了通过一定的方式去保护流量过大时(对于服务本身错误的情况。一点点流量也是“流量过大”),保护系统的手段
本着资源共享的原则,欢迎各位朋友在此基础上完善,并进一步分享,让我们的实现更加优雅。如果有任何疑问和需要进一步交流可以留言沟通
Testner创始人(testner.club) Sea