一、服务雪崩是什么?
定义
服务雪崩效应是一种因“服务提供者的不可用”(原因)导致“服务调用者不可用”(结果),并将不可用逐渐放大的现象。
形成原因
服务雪崩的过程可以分为三个阶段:
服务提供者不可用;
重试加大请求流量;
服务调用者不可用;
服务雪崩的每个阶段都可能由不同的原因造成,总结如下:
应对策略
二、演示服务雪崩
2.1.修改 tomcat 的连接池 线程数量
server:
port: 8090 # 服务端口
tomcat:
max-threads: 10 #tomcat的最大并发值修改为10,默认是200
2.2 安装 配置并发测试工具
使用 jmeter
三.常见容错方案有
要防止雪崩的扩散,我们就要做好服务的容错
常见的容错方案:隔离、超时、限流、熔断、降级
3.1 隔离
指的是系统按照一定原则划分若干个服务模块,各个模块之间相对独立、无强依赖,当有故障发生时,能将问题和影响隔离在某个模块内部,而不扩散风险,不波及其他模块,不影响整体的系统服务,如线程池隔离和信号量隔离
3.2 超时
指的是在上游服务调用下游服务的时候,设置一个最大响应时间,如果超过这个时间,下游未作出反应,就断开请求,释放掉线程,达到自我保护的目的。
3.3 限流
限制系统的输入和输出流量,达到保护系统目的。为了保证系统的稳固运行,一旦达到设置的阈值,就需要限流。
3.4 熔断
如果下游服务因为访问压力过大而影响变慢或者失败,上游服务为了保证系统整体可用性,可以暂时切断对下游服务的调用,这种局部牺牲,保全整体的措施就是熔断。
服务熔断的三种状态
- 熔断关闭 Closed
熔断没有故障时,熔断器所处的状态,对于调用方不做任何限制 - 熔断开启 Open
后续对该服务接口的调用不在经过网络,直接执行本地fallback方法 - 半熔断Half-Open
尝试恢复调用,允许有限的流量调用该服务,并且监控调用成功率,如果成功率达到预期,则说明服务已经恢复,进入熔断关闭,如果成功率很低,则重新进入熔断开启。
基本模式:
如果断路器状态为close,则调用断路器将调用supplier服务模块;
如果断路器状态为open则直接返回错误;
如果超时,我们将增加失败计数器,成功的调用会将其重置为零;
通过比较故障计数和阈值来确定断路器的状态;
3.5 降级
降级是为服务提供一个托底方案,一旦服务无法正常调用,就使用托底(备用)方案。
常用的降级策略如:熔断器降级,限流降级,超时降级,异常降级,平均响应时间降级等
- 熔断器降级:即熔断器开启的时间直接熔断走降级的策略
- 限流降级:对流量进行限制达到降级的效果,如:Hystrix中的线程池,信号量都能达到限流的效果
- 超时降级:课时设置对应的超时时间如果服务调用超时了就执行降级策略,如:Hystrix中默认为1s
- 异常降级:异常降级很简单就是服务出现异常了执行降级策略
- 平均响应时间降级:服务响应时间持续飙高的时候实现降级策略,如Sentinel中默认的RT 上限是 4900 ms
参考链接: 参考:https://segmentfault.com/a/1190000020791119?utm_source=tag-newest.