【2024面试刷题】二、Spring Cloud 面试题之Hystrix

1、springcloud断路器的作用是什么?

答:当一个服务调用另一个服务由于网络原因或自身原因出现问题时,调用者将等待被调用者的响应 当更多的服务要求这些资源导致更多的请求等待时,就会出现连锁效应(雪崩效应)。断路器完全打开:一段时间内 达到一定次数不能调用 并且多次监测无恢复迹象 断路器完全打开 那么下一个请求就不会要求服务了。半开:短时间内有恢复迹象,断路器会向服务发出部分请求,正常调用时断路器会关闭;关闭:服务处于正常状态时,可以正常调用。

在分布式架构中,断路器模式的功能也相似。当服务单元出现故障(类似于电器短路)时,通过断路器故障监控(类似于熔断保险丝)将错误响应返回给调用器,而不是长时间等待。这样,由于调用故障服务,线程就不会被长期占用,也不会被释放,以避免故障在分布式系统中的传播。

2、什么是Hystrix

Hystrix 是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时,异常等,Hystrix能保证一个依赖出问题的情况下,不会导致整个服务失败,避免级联故障,以提高分布式系统的弹性。

3、谈谈服务雪崩效应

雪崩效应是在大型互联网项目中,当某个服务发生宕机时,调用这个服务的其他服务也会发生宕机,大型项目的微服务之间的调用是互通的,这样就会将服务的不可用逐步扩大到各个其他服务中,从而使整个项目的服务宕机崩溃.

4、在微服务中,如何保护服务?

一般使用使用Hystrix框架,实现服务隔离来避免出现服务的雪崩效应,从而达到保护服务的效果。

5、Hystrix防雪崩的四种方式

  1. 服务降级:接口调用失败就调用本地的方法返回一个空
  2. 服务熔断:接口调用失败就会进入调用接口提前定义好的一个熔断的方法,返回错误信息
  3. 服务隔离:隔离服务之间相互影响
  4. 服务监控:在服务发生调用时,会将每秒请求数、成功请求数等运行指标记录下来。

6、服务雪崩效应产生的原因

  • 硬件故障
  • 程序Bug
  • 缓存击穿
  • 用户请求量过大

7、重试造成的流量加大的原因

  • 用户的频繁重试
  • 代码逻辑重试

8、解决服务雪崩问题方案

  • 增加硬件设施
  • 流量控制(网关限流,nignx限流,AOP限流,关闭程序重试)
  • 缓存(缓存预加载)
  • 服务的降级、服务的熔断

9、谈谈服务降级、熔断、服务隔离

  • 服务降级:当客户端请求服务器端的时候,防止客户端一直等待,不会处理业务逻辑代码,直接返回一个友好的提示给客户端。
  • 服务熔断:是在服务降级的基础上更直接的一种保护方式,当在一个统计时间范围内的请求失败数量达到设定值或当前的请求错误率达到设定的错误率阈值时开启断路,之后的请求直接走fallback方法,在设定时间(sleepWindowInMilliseconds)后尝试恢复。
  • 服务隔离:就是Hystrix为隔离的服务开启一个独立的线程池,这样在高并发的情况下不会影响其他服务。服务隔离有线程池和信号量两种实现方式,一般使用线程池方式。

10、服务降级底层是如何实现的?

Hystrix实现服务降级的功能是通过重写HystrixCommand中的getFallback()方法,当Hystrix的run方法或construct执行发生错误时转而执行getFallback()方法。

11、什么是服务熔断?什么是服务降级?

答:在复杂的分布式系统中,微服务之间的相互呼叫可能会导致服务堵塞的各种原因。在高并发场景下,服务堵塞意味着线程堵塞,导致当前线程不可用,服务器线程全部堵塞,导致服务器崩溃。由于服务之间的呼叫关系是同步的,它将导致整个微服务系统的服务雪崩。为了解决微服务的调用响应时间过长或不可用,占用越来越多的系统资源,导致雪崩效应,需要进行服务熔断和服务降级。

所谓服务熔断,是指某个服务故障或异常在一起,类似于显示世界“保险丝”当异常情况被触发时,整个服务将被直接熔断,而不是等到服务加班。

服务熔断相当于我们电闸的保险丝,一旦发生服务雪崩,整个服务将被熔断。通过维护自己的线程池,当线程达到阈值时,将启动服务降级。如果其他请求继续访问,则直接返回fallback的默认值。

12、Hystrix是如何实现它的目标的?

Hystrix 通过:

  • 将所有调用封装到一个HystrixCommand或hystrix观察者的对象中,通常在一个单独的线程中执行(这是命令模式的一个例子)。
  • 时间的调用比你定义的阈值要长。有一个默认值,但是对于大多数依赖项,您可以通过“属性”来定制这些超时,这样它们就会比每个依赖项的99.5%的性能稍微高一些。
  • 维护每个依赖项的一个小线程池(或信号量);如果它变得满了,那么就会立即拒绝请求这个依赖项的请求,而不是排队。
  • 测量成功、失败(客户端抛出的异常)、超时和线程拒绝。
  • 在一段时间内,如果服务的错误百分比超过了一个阈值,就会触发一个断路器来停止对特定服务的所有请求,无论是手动的还是自动的。
  • 当一个请求失败时执行回退逻辑,被拒绝,超时,或短路。
  • 监控指标和配置在接近实时的情况下发生变化。
posted @ 2024-03-12 11:10  YYNo1  阅读(331)  评论(0编辑  收藏  举报