雪崩效应
服务雪崩效应就是因为服务提供者不可用,导致服务直接或间接的调用者不可用,最终把不可用的范围不断放大。
以上图为例,A作为服务提供者,B是A的服务调用者,C是B的服务调用者,D和E是C的服务调用者;当服务A不可用时(所有实例都挂了 ),而服务B还在疯狂调用服务A的API,A服务挂了就会导致B发往A的请求强制等待,直至请求超时;Java程序中,一次请求往往代表一个线程,如果请求被强制等待了,线程就会被强制阻塞,直到请求超时线程才会被释放;在高并发的应用系统中,阻塞的线程会越来越多,而线程代表着服务器的计算资源(如内存、CPU),如果不做任何处理,终将导致B服务也无法创建新的线程,B服务也挂了;同理,也导致调用B的服务C不可用,最终导致整个系统服务宕机
常见的容错方案
-
超时
设置较短的超时时间,不管是否请求成功,只要一到超时时间,线程就会释放 -
限流
设置合理的QPS,只要超过整个阈值,请求就会被直接拒绝,实现了自我保护 -
仓壁模式
为每个API创建独立的线程池 - 断路器模式
马丁大叔眼里的断路器模式