Skip to content

面试速答(先看这里)

**一句话结论:**想要知道如何防止雪崩,需要知道什么是雪崩,以及雪崩时怎么引起的。

60秒标准回答:

想要知道如何防止雪崩,需要知道什么是雪崩,以及雪崩时怎么引起的

在微服务架构中,指的是一种极具破坏性的“连锁故障”现象。 简单来说,当整个调用链路中的某个下游基础服务出现故障(如响应慢或直接宕机)时,上游依赖它的服务会因为等待响应而大量阻塞线程、耗尽资源,进而导致上游服务也发生崩溃。这种故障会像多米诺骨牌一样沿着调用链不断向上蔓延,最终拖垮整个系统

雪崩是怎么引起的?

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**在微服务架构中,指的是一种极具破坏性的“连锁故障”现象。
  • **要点2:**通过上面的定义,我们知道了,要发生雪崩,首先需要有服务之间的相互的同步调用、接着调用无法被降级或熔断、再接着发生了一个初始故障、进而导致一个调用链中的上下游都跟着挂了。
  • **要点3:**知道了什么是雪崩,以及他的发生原因,如何防止就不那么难了,逐一拆解即可。
  • **要点4:**2、重试策略优化。
  • **要点5:**4、限流降级熔断。

**记忆锚点:**待响应而大量阻塞线程 → 的批任务调用或者重试 → 似指数退避的重试机制 → 3避免循环依赖调用 → 个好的方案是设计类 → 2重试策略优化

关键取舍:

  • 简单来说,当整个调用链路中的某个下游基础服务出现故障(如响应慢或直接宕机)时,上游依赖它的服务会因为等待响应而大量阻塞线程、耗尽资源,进而导致上游服务也发生崩溃。

易错提醒:

  • 有些系统一旦下游失败了,就会疯狂重试,这样会加剧故障的发生,导致雪崩,一个好的方案是设计类似指数退避的重试机制,来避免因为不断重试而对下游服务带来的额外压力。
  • 可以大大的避免互相影响和雪崩现象的发生。

加分表达:

  • 那么如果有一些交互,可以换成异步调用的话,比如用MQ交互,那么雪崩就可能不会发生了。
  • 一个解决雪崩的彻底的办法,就是如果下游崩了,我不跟着崩,那就是限流降级熔断一把梭。
  • 2、重试策略优化。

追问准备:

  • 围绕「待响应而大量阻塞线程」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「的批任务调用或者重试」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「似指数退避的重试机制」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

想要知道如何防止雪崩,需要知道什么是雪崩,以及雪崩时怎么引起的。

什么是雪崩?

**在微服务架构中,指的是一种极具破坏性的“连锁故障”现象。**简单来说,当整个调用链路中的某个下游基础服务出现故障(如响应慢或直接宕机)时,上游依赖它的服务会因为等待响应而大量阻塞线程、耗尽资源,进而导致上游服务也发生崩溃。这种故障会像多米诺骨牌一样沿着调用链不断向上蔓延,最终拖垮整个系统。

雪崩是怎么引起的?

通过上面的定义,我们知道了,要发生雪崩,首先需要有服务之间的相互的同步调用、接着调用无法被降级或熔断、再接着发生了一个初始故障、进而导致一个调用链中的上下游都跟着挂了。

而这里面初始故障的话,一般是某个至关重要的系统发生了一个耗时操作、或者系统直接挂了。那么导致这个系统出问题,可能是因为系统本身有问题,比如慢SQL了,CPU打满了。也可能是系统有突发流量了,导致扛不住了,还有可能就是上游存在不合理的批任务调用或者重试。还有一种可能,那就是服务之间出现了循环依赖调用。

如何防止雪崩?

知道了什么是雪崩,以及他的发生原因,如何防止就不那么难了,逐一拆解即可。

1、减少强依赖。之所以又雪崩,是系统之间有同步调用的强依赖。那么如果有一些交互,可以换成异步调用的话,比如用MQ交互,那么雪崩就可能不会发生了。

**2、重试策略优化。**有些系统一旦下游失败了,就会疯狂重试,这样会加剧故障的发生,导致雪崩,一个好的方案是设计类似指数退避的重试机制,来避免因为不断重试而对下游服务带来的额外压力。

📄 ✅你知道有哪些退避策略吗?

打开文档:✅你知道有哪些退避策略吗?

**3、避免循环依赖调用。**这个下面单独讲过,不展开了。

📄 ✅各个微服务之间,有哪些调用(通信)方式?

打开文档:✅各个微服务之间,有哪些调用(通信)方式?

4、限流降级熔断。一个解决雪崩的彻底的办法,就是如果下游崩了,我不跟着崩,那就是限流降级熔断一把梭。可以大大的避免互相影响和雪崩现象的发生。

📄 ✅限流、降级、熔断有什么区别?

打开文档:✅限流、降级、熔断有什么区别?