“限流、熔断与降级”

限流 Rate Limiting

限流是从系统的流量入口考虑,从进入的流量上进行限制,达到保护系统的作用

是指需要限制并发/请求量的场景 (如秒杀等) ,通过限流保护服务免受雪崩之灾。 计数器 多少次每秒/每分/每天,根据作用范围的不同,计算器可以分为单机计数器即Local Counter (每个机器都有自己的计数器) 和全局计数器也就是分布式计数器即Global Counter (所有机器公有一个计数器阈值)

令牌桶

令牌桶算法是网络流量整形 (Traffic Shaping) 和速率限制 (Rate Limiting) 中最常使用的一种算法。典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送。 令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。

漏桶

漏桶算法思路很简单,水 (请求) 先进入到漏桶里,漏桶以一定的速度出水,当水流入速度过大会直接溢出,可以看出漏桶算法能强行限制数据的传输速率。

方法优点缺点
计数器简单方便存在一下子被刷完计数器的情况
令牌桶可以处理瞬间突发的流量~
漏桶限制请求的平均速率不能处理瞬间流量的情况,当流量把漏桶装满后,大部分的请求都会被丢弃掉

熔断 Circuit Breaker

主调熔断

主调熔断是熔断的主要场景,在微服务中是结合服务注册和发现组件来使用的。主调通过服务发现组件来获取被调的实例,如果主调的失败达到了一个阈值,服务发现组件会熔断被调的实例。

被调熔断

被调熔断,被调实例获取当前的实例负载情况,如果cpu/内存/io 等超过了一定的阈值,那么就会触发熔断,将抛弃进来的请求。此时熔断和限流比较像,一个是基于负载情况,一个是根据配置的阈值情况。

降级

降级,是从系统内部的平级服务或者业务的维度考虑,流量大了,可以干掉一些,保护其他功能正常使用。

降级也就是服务降级,当我们的服务器压力剧增为了保证核心功能的可用性 ,而选择性的降低一些功能的可用性,或者直接关闭该功能。这就是典型的丢车保帅了。当服务暂时不可用或者影响到核心流程时,需要待高峰或者问题解决后再打开。通过降级实现部分可用、有损服务。主流的降级策略有基于RT (响应时间) 、异常比率和异常数的降级。

就比如贴吧类型的网站,当服务器吃不消的时候,可以选择把发帖功能关闭,注册功能关闭,改密码,改头像这些都关了,为了确保登录和浏览帖子这种核心的功能。

降级的手段大致有这么三种

强一致变为最后一致,延迟服务

干掉一些次要功能

简化流程

每个服务都需要制定自己的降级策略,根据服务不同的优先级来设定降级方案。另外降级策略最好是由开关系统或者配置系统统一控制。一般而言都会建立一个独立的降级系统,可以灵活且批量的配置服务器的降级功能。当然也有用代码自动降级的,例如接口超时降级、失败重试多次降级等。具体失败几次,超时设置多久,由你们的业务等其他因素决定。开个小会,定个值,扔线上去看看情况。根据情况再调优。

熔断和限流都可以认为是降级的一种方式


https://xie.infoq.cn/article/2593d1a3b9e1e06cac6502c4f?utm_source=rss&utm_medium=article