主题
面试速答(先看这里)
**一句话结论:**想要知道如何防止雪崩,需要知道什么是雪崩,以及雪崩时怎么引起的。
60秒标准回答:
想要知道如何防止雪崩,需要知道什么是雪崩,以及雪崩时怎么引起的
在微服务架构中,指的是一种极具破坏性的“连锁故障”现象。 简单来说,当整个调用链路中的某个下游基础服务出现故障(如响应慢或直接宕机)时,上游依赖它的服务会因为等待响应而大量阻塞线程、耗尽资源,进而导致上游服务也发生崩溃。这种故障会像多米诺骨牌一样沿着调用链不断向上蔓延,最终拖垮整个系统
雪崩是怎么引起的?
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **要点1:**在微服务架构中,指的是一种极具破坏性的“连锁故障”现象。
- **要点2:**通过上面的定义,我们知道了,要发生雪崩,首先需要有服务之间的相互的同步调用、接着调用无法被降级或熔断、再接着发生了一个初始故障、进而导致一个调用链中的上下游都跟着挂了。
- **要点3:**知道了什么是雪崩,以及他的发生原因,如何防止就不那么难了,逐一拆解即可。
- **要点4:**2、重试策略优化。
- **要点5:**4、限流降级熔断。
**记忆锚点:**待响应而大量阻塞线程 → 的批任务调用或者重试 → 似指数退避的重试机制 → 3避免循环依赖调用 → 个好的方案是设计类 → 2重试策略优化
关键取舍:
- 简单来说,当整个调用链路中的某个下游基础服务出现故障(如响应慢或直接宕机)时,上游依赖它的服务会因为等待响应而大量阻塞线程、耗尽资源,进而导致上游服务也发生崩溃。
易错提醒:
- 有些系统一旦下游失败了,就会疯狂重试,这样会加剧故障的发生,导致雪崩,一个好的方案是设计类似指数退避的重试机制,来避免因为不断重试而对下游服务带来的额外压力。
- 可以大大的避免互相影响和雪崩现象的发生。
加分表达:
- 那么如果有一些交互,可以换成异步调用的话,比如用MQ交互,那么雪崩就可能不会发生了。
- 一个解决雪崩的彻底的办法,就是如果下游崩了,我不跟着崩,那就是限流降级熔断一把梭。
- 2、重试策略优化。
追问准备:
- 围绕「待响应而大量阻塞线程」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「的批任务调用或者重试」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「似指数退避的重试机制」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
典型回答
想要知道如何防止雪崩,需要知道什么是雪崩,以及雪崩时怎么引起的。
什么是雪崩?
**在微服务架构中,指的是一种极具破坏性的“连锁故障”现象。**简单来说,当整个调用链路中的某个下游基础服务出现故障(如响应慢或直接宕机)时,上游依赖它的服务会因为等待响应而大量阻塞线程、耗尽资源,进而导致上游服务也发生崩溃。这种故障会像多米诺骨牌一样沿着调用链不断向上蔓延,最终拖垮整个系统。
雪崩是怎么引起的?
通过上面的定义,我们知道了,要发生雪崩,首先需要有服务之间的相互的同步调用、接着调用无法被降级或熔断、再接着发生了一个初始故障、进而导致一个调用链中的上下游都跟着挂了。
而这里面初始故障的话,一般是某个至关重要的系统发生了一个耗时操作、或者系统直接挂了。那么导致这个系统出问题,可能是因为系统本身有问题,比如慢SQL了,CPU打满了。也可能是系统有突发流量了,导致扛不住了,还有可能就是上游存在不合理的批任务调用或者重试。还有一种可能,那就是服务之间出现了循环依赖调用。
如何防止雪崩?
知道了什么是雪崩,以及他的发生原因,如何防止就不那么难了,逐一拆解即可。
1、减少强依赖。之所以又雪崩,是系统之间有同步调用的强依赖。那么如果有一些交互,可以换成异步调用的话,比如用MQ交互,那么雪崩就可能不会发生了。
**2、重试策略优化。**有些系统一旦下游失败了,就会疯狂重试,这样会加剧故障的发生,导致雪崩,一个好的方案是设计类似指数退避的重试机制,来避免因为不断重试而对下游服务带来的额外压力。
**3、避免循环依赖调用。**这个下面单独讲过,不展开了。
4、限流降级熔断。一个解决雪崩的彻底的办法,就是如果下游崩了,我不跟着崩,那就是限流降级熔断一把梭。可以大大的避免互相影响和雪崩现象的发生。