目录
目录
1、概念
1.1 降级
1.1.1 常见降级:
1.1.2 示例
1.2 熔断
1.2.1 熔断设计
1.2.2 示例
1.3 限流
1.3.1 算法
1.3.2 示例
2、区别
3、案例
1、概念
1.1 降级
- 服务降级处理是在客户端实现完成的,与服务端没有关系。
- 当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。降级的思想是丢车保帅。
1.1.1 常见降级:
- 服务接口拒绝服务:页面能访问,但是添加删除提示服务器繁忙。页面内容也可在Varnish或CDN内获取。
- 页面拒绝服务:页面提示由于服务繁忙此服务暂停。跳转到varnish或nginx的一个静态页面。
- 延迟持久化:页面访问照常,但是涉及记录变更,会提示稍晚能看到结果,将数据记录到异步队列或log,服务恢复后执行。
- 随机拒绝服务:服务接口随机拒绝服务,让用户重试,目前较少有人采用。因为用户体验不佳。
1.1.2 示例
A -> B -> C,C服务存在C1、C2、C3、C4
- 如果C4优先级较低,一定是先降级优先级低的接口C4 。
- 如果服务链路整体没有性能特别差的点,比如就是外部流量突然激增,那么就从外到内开始降级。
- 如果某个服务能检测到自身负载上升,那么可以从这个服务自身做降级。
1.2 熔断
如果某个目标服务调用慢或者有大量超时,此时,熔断该服务的调用,对于后续调用请求,不在继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用。
1.2.1 熔断设计
三个模块:熔断请求判断算法、熔断恢复机制、熔断报警。
- 熔断请求判断机制算法:使用无锁循环队列计数,每个熔断器默认维护10个bucket,每1秒一个bucket,每个blucket记录请求的成功、失败、超时、拒绝的状态,默认错误超过50%且10秒内超过20个请求进行中断拦截。
- 熔断恢复:对于被熔断的请求,每隔5s允许部分请求通过,若请求都是健康的(RT<250ms)则对请求健康恢复。
- 熔断报警:对于熔断的请求打日志,异常请求超过某些设定则报警。
1.2.2 示例
A -> B -> C,如果C出现问题了,那么B熔断了,则A就不用熔断了。
1.3 限流
限流模式主要是提前对各个类型的请求设置最高的QPS阈值,若高于设置的阈值则对该请求直接返回,不再调用后续资源。
常见限流方式
1.3.1 算法
- 漏桶算法:漏桶算法思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水,当水流入速度过大会直接溢出,可以看出漏桶算法能强行限制数据的传输速率。
- 令牌桶算法:对于很多应用场景来说,除了要求能够限制数据的平均传输速率外,还要求允许某种程度的突发传输。这时候漏桶算法可能就不合适了,令牌桶算法更为适合。
令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。
单机限流:Guava 中的 RateLimiter。在 Guava 的 RateLimiter 中,使用的就是令牌桶算法,允许部分突发流量传输。在其源码里,可以看到能够突发传输的流量等于 maxBurstSeconds * qps。
集群限流:TC 提供的 common-blocking 组件提供此功能。
算法对比:https://blog.csdn.net/xixingzhe2/article/details/128904027
1.3.2 示例
B只允许A以QPS<=5的流量请求,而C却只允许B以QPS<=3的qps请求,那么B给A的设定就有点大,上游的设置依赖下游。而且限流对QPS的配置,可能会随着服务加减机器而变化,最好是能在集群层面配置,自动根据集群大小调整。
2、区别
概念 |
目的 |
触发方 |
触发场景 |
解决方 |
处理方案 |
所有用户表现一致 |
用户表现 |
熔断 |
从可用性可靠性着想,为防止系统的整体缓慢甚至崩溃 |
某个服务(下游服务)不可用 |
当失败的调用到一定阈值,如缺省是5秒内20次调用失败,就会启动熔断机制,自动触发 |
调用方 |
开启熔断之后,如何实现自动恢复?每隔一段时间,释放一个请求到服务端进行探测,如果后端服务已经恢复,则自动恢复 |
不一致 |
用户体验到的是某些功能暂时不可达或不可用 |
降级 |
为防止系统的整体缓慢甚至崩溃 |
服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉 |
整体负荷比较大,进行人工干预 |
调用方 |
取消降级 |
一致 |
用户体验到的是某些功能暂时不可达或不可用 |
限流 |
通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统 |
通过对进行限速来保护系统 |
超出了服务每分钟的调用量或服务的某个方法调用量 |
如果是由于当时压测并发数较高引起;视具体情况而定 |
调大阈值 |
一致 |
一旦达到限制速率则可以拒绝服务或等待 |
3、案例
如果你来设计一个整点限量秒杀系统,包括登录、抢购、支付(依赖支付宝)等核心功能,你会如何设计接口级的故障应对手段?
思路:
- 降级(丢车保帅):在秒杀时,通过服务降级把注册、修改个人信息等非核心功能关闭掉。
- 熔断:支付依赖第三方服务,要设置熔断策略,熔断后要给出友好提示,比如10分钟后再来支付。
- 限流:抢购下单接口采用限流方式,如抢购1000件商品,则设置2000大小的队列,请求超过2000后直接拒绝掉。
参考:
服务降级、熔断、限流的区别_会思考的男人的博客-CSDN博客_服务熔断和服务降级和服务限流
压力测试术语之熔断、降级、限流-布布扣-bubuko.com
服务降级,服务熔断,服务限流 - 巍巍的个人页面 - OSCHINA - 中文开源技术交流社区
熔断,限流,降级 一些理解 - 简书