什么是雪崩效应
假如我们有一个服务C,向服务B提供接口,服务B有很多请求发送到服务C
当服务C发生了宕机的时候,服务B发送到服务C的请求会阻塞掉,会导致服务B的内存被这些阻塞的线程占满而导致服务对外提供服务,而导致服务B产生宕机
与此同时,服务B作为服务A的提供者
同样的问题也会产生,导致服务A也无法使用
这一连串的效应导致整个系统挂掉,这样的现象称为雪崩效应
解决雪崩效应
1、设置线程的超时时间
在服务B调用服务C的时候,当服务C挂掉,如果给服务B调用服务C的每个线程都设置超时时间,例如500ms,当前几个线程阻塞500ms后,自动销毁,后续线程继续调用,以此解决由于服务B线程阻塞导致内存占满使得服务B挂掉的问题
2、设置限流
有三个服务A、B、C,当服务C因为一些网络性能问题挂掉
服务A发送到服务B的请求,同时再有一个请求发送到服务C,同理服务A发送请求到服务B,服务B再发送请求到服务C,当到达一个上限的时候,我们不会让服务B发请求到服务C,通过设置限流让服务B嘴都有三个线程发送到服务C,当三个线程满了的时候,就不会再新增线程请求服务C,此时不管服务A向服务B发送多少个请求,服务B都不会再发送请求到服务C,防止服务B因为内存过多导致服务B挂掉
3、熔断
当服务正常请求成功的时候,熔断处于关闭状态,而当服务调用失败的时候,熔断开关打开,那我们请求都会被跳过,不会真正请求整个服务,这样避免整个服务挂掉。
在分部式场景下一般都会有一个时间窗口,这个时间窗口会在时间窗口结束的时候会尝试调用之前挂掉的服务,熔断开关处于半开半闭状态,当请求失败的时候,熔断开关打开,当请求成功的时候,熔断开关关闭
文章参考慕课网实战教程