高并发下的服务熔断、降级、限流都是保护系统稳定性的重要机制,它们可以避免系统出现过载或者崩溃的情况。
一、熔断
1、概念:如果某个目标服务调用量太大或者响应时间太长,此时,熔断该服务的调用,当检测到目标服务情况好转则恢复调用。因此熔断是对服务的一种链路保护机制。
2、原理:服务熔断是指调用方访问服务时通过断路器做代理进行访问,断路器会持续观察服务返回的成功、失败的状态,当失败超过设置的阈值时断路器打开,请求就不能真正地访问到服务了。
- 断路器默认处于“关闭”状态,当服务提供者的错误率到达阈值,就会触发断路器“开启”。
- 断路器开启后进入熔断时间,到达熔断时间终点后重置熔断时间,进入“半开启”状态。
- 在半开启状态下,如果服务提供者的服务能力恢复,则断路器关闭熔断状态。进而进入正常的服务状态。
- 在半开启状态下,如果服务提供者的服务能力未能恢复,则断路器再次触发服务熔断,进入熔断时间。
一般而言,熔断状态不会一直持续,而是有一个时间范围,时间过了以后再去尝试请求服务提供者,一旦服务提供者的服务能力恢复,请求将继续可以调用服务提供者。
熔断的3 种状态:CLOSED、OPEN、HALF OPEN
CLOSED:默认状态。断路器观察到请求失败比例没有达到阈值,断路器认为被代理服务状态良好。
OPEN:断路器观察到请求失败比例已经达到阈值,断路器认为被代理服务故障,打开开关,请求不再到达被代理的服务,而是快速失败。
HALF OPEN:断路器打开后,为了能自动恢复对被代理服务的访问,会切换到半开放状态,去尝试请求被代理服务以查看服务是否已经故障恢复。如果成功,会转成 CLOSED 状态,否则转到 OPEN 状态。
二、降级
1、概念:降级也就是服务降级,当我们的服务器压力剧增,为了保证核心功能的可用性 ,而选择性的降低一些功能的可用性,或者直接关闭该功能。
2、降级的方式有哪些?
第一,延迟服务:定时任务处理、或者mq延时处理。比如新用户注册送多少优惠券可以提示用户优惠券会24小时到达用户账号中,我们可以选择再凌晨流量较小的时候,批量去执行送券。
第二,被动降价,前端页面降级:页面点击按钮全部置灰,或者页面调整成为一个静态页面显示“系统正在维护中”。
第三,主动降级,关闭非核心服务:比如电商关闭推荐服务、关闭运费险、退货退款等。保证主流程的核心服务下单付款就好。
第四,写降级:比如秒杀抢购,我们可以只进行Cache的更新返回,然后通过mq异步扣减库存到DB,保证最终一致性即可,此时可以将DB降级为Cache。
第五,读降级:比如多级缓存模式,如果后端服务有问题,可以降级为只读缓存,这种方式适用于对读一致性要求不高的场景。
3、自动降级的条件
a.调用失败次数达到阈值
b.请求响应超时时间达到阈值
c.请求下游服务发生故障通过状态码
d.流量达到阈值触发服务降级(限流也可以触发降级)
4、怎样实现降级
a.降级开源组件:sentinel和Hystrix
-
Sentinel 是阿里中间件团队研发的面向分布式服务架构的轻量级高可用流量控制组件,于2018年7月正式开源。Sentinel
主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户提升服务的稳定性。 -
Hystrix是由Netflix开源的一个工具类库,经常被用于服务的熔断,降级等领域,基于RxJava(一种基于观察者模式的响应式编程框架)实现,具备服务降级、服务熔断、线程与信号隔离、请求缓存、请求合并以及服务监控等强大功能。
b.手动降级:可采用系统配置开关来控制
服务熔断通常适与服务降级配合使用。在服务发生熔断后,一般会让请求走事先配置的处理方法,这个处理方法就是一个降级逻辑。
当触发服务熔断后,服务调用者就不再调用远程服务方法,而是调用本地的fallback方法。此时你需要预先提供一个处理方法,作为服务降级之后的执行方法,fallback返回值一般是设置的默认值或者来自缓存。
三、限流
1、概念:服务限流是指当系统资源不够,不足以应对大量请求,即系统资源与访问量出现矛盾的时候,我们为了保证有限的资源能够正常服务,因此对系统按照预设的规则进行流量限制或功能限制的一种方法。
2、目前主流的限流指标
a.TPS
系统吞吐量是衡量系统性能的关键指标,按照事务的完成数量来限流是最合理的。
b.HPS
每秒请求数,指每秒钟服务端收到客户端的请求数量。
c.QPS
服务端每秒能够响应的客户端查询请求数量。
3、三种常见的限流实现方式
1、计数器方法(达到阈值直接拒绝访问),比如我们规定,对于A接口来说,我们1分钟的访问次数不能超过100个。
2、令牌桶算法
令牌桶算法是比较常见的限流算法之一,大概描述如下:
所有的请求在处理之前都需要拿到一个可用的令牌才会被处理;
根据限流大小,设置按照一定的速率往桶里添加令牌;
桶设置最大的放置令牌限制,当桶满时、新添加的令牌就被丢弃或者拒绝;
请求达到后首先要获取令牌桶中的令牌,拿着令牌才可以进行其他的业务逻辑,处理完业务逻辑之后,将令牌直接删除;
令牌桶有最低限额,当桶中的令牌达到最低限额的时候,请求处理完之后将不会删除令牌,以此保证足够的限流;
3、漏桶算法
漏桶算法其实很简单,可以粗略的认为就是注水漏水过程,往桶中以一定速率流出水,以任意速率流入水,当水超过桶流量则丢弃,因为桶容量是不变的,保证了整体的速率。
四、三种措施的差异