服务雪崩

服务雪崩

一、如何解决灾难性雪崩效应

1.1、造成雪崩的原因

  1. A.服务提供者不可用(硬件故障,程序Bug,缓存击穿,用户大量请求)
  2. 重试加大流量(用户重试,代码逻辑重试)
  3. 服务调用者不可用(同步等待造成的资源耗尽)最终的结果就是一个服务不可用,导致一系列服务的不可用,而往往这种后果往往无法预料的。

1.2、如何解决雪崩

  1. 降级:超时降级、资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据。实现一个fallback方法, 当请求后端服务出现异常的时候, 可以使用fallback方法返回的值.
  2. 隔离(线程池隔离和信号量隔离):限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用。
  3. 融断:当失败率(如因网络故障/超时造成的失败率高)达到阀值自动触发降级,熔断器触发的快速失败会进行快速恢复。
  4. 缓存:提供了请求缓存。
  5. 请求合并:提供请求合并。

二、服务降级

服务雪崩

三、服务请求缓存

服务雪崩

四、服务请求合并

服务雪崩

五、服务熔断

熔断机制相当于电路的跳闸功能。例如:我们可以配置熔断策略为当请求错误比例在10s内>50%时,该服务将进入熔断状态,后续请求都会进入fallback。
服务雪崩

5.1、熔断原理图

服务雪崩

六、隔离技术之线程

服务雪崩

6.1、线程池隔离的优点

  1. 使用线程池隔离可以完全隔离依赖的服务(例如图中的A、B、C服务),请求线程可以快速放回。
  2. 当线程池出现问题时,线程池隔离是独立的,不会影响其他服务和接口。
  3. 当失败的服务再次变得可用时,线程池将清理并可立即恢复,而不需要一个长时间的恢复。
  4. 独立的线程池提高了并发性。

6.2、线程池隔离的缺点

线程池隔离的主要缺点是它们增加计算开销(CPU)。每个命令的执行涉及到排队、调度和上 下文切换都是在一个单独的线程上运行的。

七、隔离技术之信号量

服务雪崩

八、线程池隔离和信号量隔离

服务雪崩
8.1、什么情况下,用线程池隔离?
请求并发量大,并且耗时长(请求耗时长一般是计算量大,或读数据库):采用线程隔离策略,这样的话,可以保证大量的容器(tomcat)线程可用,不会由于服务原因,一直处于阻塞或等待状态,快速失败返回。
8.2、什么情况下,用信号量隔离?
请求并发量大,并且耗时短(请求耗时短可能是计算量小,或读缓存):采用信号量隔离策略,因为这类服务的返回通常会非常的快,不会占用容器线程太长时间,而且也减少了线程切换的一些开销,提高了缓存服务的效率。

九、Feign的雪崩处理:服务降级处理

9.1、Feign服务降级处理
9.2、Feign服务降级后的异步记录

十、Dashboard

服务雪崩
10.1、集群环境下,收集监控数据(turbine)

十一、资料

11.1、源码示例
spring-cloud/ 服务雪崩