限流、熔断、降级¶
关系¶
熔断 : 强调的是服务之间的调用能实现自我恢复的状态; 限流 : 是从系统的流量入口考虑,从进入的流量上进行限制,达到保护系统的作用; 降级 : 是从系统内部的平级服务或者业务的维度考虑,流量大了,可以干掉一些,保护其他正常使用;
熔断是降级方式的一种; 降级又是限流的一种方式; 三者都是为了通过一定的方式去保护流量过大时,保护系统的手段。
1. 熔断¶
1.1 熔断来源¶
保险丝就是一个自我保护装置,保护整个电路。
1.2 分布式系统中的熔断¶
在分布式系统中,我们往往需要依赖下游服务,不管是内部系统还是第三方服务,如果下游出现问题,我们还是盲目地去请求,及时失败了多次,还是傻傻的去请求,去等待。
- 增加了整个链路的请求时间;
- 下游系统本身就出现了问题,不断的请求又把系统问题加重了,恢复困难。
1.3 熔断的作用¶
熔断模式可以防止应用程序不断地尝试可能超时和失败的服务,能达到应用程序执行而不必等待下游服务修正错误服务。 熔断器模式最牛的是能让应用程序自我诊断下游系统的错误是否已经修正,如果没有,不放量去请求,如果请求成功了,慢慢的增加请求,再次尝试调用。
比如说A服务调用B服务,B服务是下游的服务提供,或者是第三方服务,容易发生问题。这样既能防止不断的调用,是下游服务更坏,保护了下游方,还能降低自己的执行成本,快速的响应,减少延迟,增加吞吐量。
2. 降级¶
2.1 降级的本质¶
降级就是为了解决资源不足和访问量增加的矛盾
在有限的资源情况下,为了能抗住大量的请求,就需要对系统做出一些牺牲,有点“弃卒保帅”的意思。放弃一些功能,保证整个系统能平稳运行
2.2 降级牺牲¶
强一致性变成最终一致性 大多数的系统是不需要强一致性的。 强一致性就要求多种资源的占用,减少强一致性就能释放更多资源 这也是我们一般利用消息中间件来削峰填谷,变强一致性为最终一致性,也能达到效果
干掉一些次要功能 停止访问不重要的功能,从而释放出更多的资源 举例来说,比如电商网站,评论功能流量大的时候就能停掉,当然能不直接干掉就别直接,最好能简化流程或者限流最好
简化功能流程。把一些功能简化掉
2.3 降级的注意点¶
对业务进行仔细的梳理和分析 哪些是核心流程必须保证的,哪些是可以牺牲的
什么指标下能进行降级
吞吐量、响应时间、失败次数等达到一个阈值才进行降级处理
如何降级 降级最简单的就是在业务代码中配置一个开关或者做成配置中心模式,直接在配置中心上更改配置,推送到相应的服务。
3. 限流¶
3.1 限流的目的¶
通过对并发访问进行限速。
3.2 限流有哪些行为¶
- 拒绝服务 最简单的方式,把多余的请求直接拒绝掉 做的高大上一些,可以根据一定的用户规则进行拒绝策略。
- 服务降级 降级甚至关掉后台的某些服务。
- 特权请求 在多租户或者对用户进行分级时,可以考虑让一些特殊的用户有限处理,其他的可以考虑干掉
- 延时处理 可以利用队列把请求缓存住。削峰填谷。
3.3 限流的实现方式¶
- 计数器
- 漏斗模式
- 令牌桶
3.4 限流的一些注意点¶
- 限流越早设计约好,架构成型后,不容易加入;
- 限流模块不要成为系统的瓶颈,性能要求高;
- 最好有个开关,可以直接介入;
- 限流发生时,能及时发出通知事件;
- 限流发生时,给用户提供友好的提示;