MST

星途 面试题库

面试题:Spring Cloud微服务架构下的熔断与降级设计原则及实现

在复杂的微服务架构中,服务之间的依赖可能会导致级联故障。请详细说明Spring Cloud中Hystrix或Sentinel等熔断与降级组件所依据的设计原则。并且结合实际场景,描述如何设计和实现一个有效的熔断与降级策略,包括如何定义熔断的触发条件、如何进行服务降级以及如何进行熔断后的恢复。
41.2万 热度难度
后端开发微服务架构

知识考点

AI 面试

面试题答案

一键面试

1. Hystrix 与 Sentinel 设计原则

Hystrix 设计原则

  • 隔离:通过线程池隔离和信号量隔离两种方式,将不同服务调用分配到不同的资源池。例如,每个微服务调用对应一个独立线程池,当某个服务调用出现故障时,不会影响其他服务调用,避免故障扩散。
  • 熔断:当服务调用失败率达到一定阈值(如失败率超过 50%),在一定时间窗口(如 10 秒)内,触发熔断机制,不再调用实际服务,直接返回失败结果,防止进一步资源浪费。
  • 降级:当服务熔断或出现资源不足(如线程池满)时,启用降级逻辑,返回兜底数据,保证系统基本可用。
  • 缓存:对一些频繁调用且数据相对稳定的服务调用结果进行缓存,减少实际调用次数,提高响应速度。
  • 监控:实时收集服务调用的指标数据,如调用次数、成功次数、失败次数、平均响应时间等,用于判断服务健康状况及触发熔断等操作。

Sentinel 设计原则

  • 流量控制:根据预设的流量规则,如 QPS(每秒查询率)、并发线程数等,对进入系统的流量进行控制,避免流量过大导致系统崩溃。例如,设置某个接口的 QPS 阈值为 100,当超过该阈值时进行流量控制。
  • 熔断降级:基于响应时间、异常比例等指标,当服务出现不稳定状态时,触发熔断。与 Hystrix 不同的是,Sentinel 可以基于慢调用比例进行熔断。
  • 系统自适应保护:根据系统的负载情况,如 CPU 使用率、内存使用率等,自动调整流量控制和熔断策略,确保系统整体稳定运行。
  • 多样化的熔断策略:支持基于慢调用、异常比例、异常数等多种熔断策略,可根据不同业务场景灵活选择。
  • 实时监控与控制台:提供实时的监控数据,通过控制台方便查看和管理系统的流量、熔断等状态,并动态调整规则。

2. 设计和实现有效的熔断与降级策略

定义熔断触发条件

  • 基于失败率:在一定时间窗口(如 10 秒)内,如果服务调用的失败率超过某个阈值(如 50%),触发熔断。例如,Hystrix 可以通过配置 circuitBreaker.errorThresholdPercentage 来设置失败率阈值。
  • 基于响应时间:当服务的平均响应时间超过一定阈值(如 500 毫秒),并且在一定时间窗口内达到一定调用次数(如 100 次),触发熔断。Sentinel 可通过设置慢调用比例和慢调用响应时间阈值来实现。
  • 基于异常数:在一定时间窗口内,服务调用产生的异常数量达到某个阈值(如 20 次),触发熔断。

服务降级

  • 返回兜底数据:例如,在电商系统中,当商品详情服务不可用时,返回默认的商品描述信息,告知用户商品信息暂时无法获取。
  • 返回友好提示:如“服务暂时不可用,请稍后重试”,给用户明确的反馈。
  • 执行备用逻辑:在订单服务中,当主支付接口不可用时,切换到备用支付接口进行支付。

熔断后的恢复

  • Hystrix:在熔断开启一段时间(如 5 秒,可通过 circuitBreaker.sleepWindowInMilliseconds 配置)后,进入半熔断状态,尝试少量请求调用实际服务。如果这些请求成功比例达到一定阈值(如 50%),则关闭熔断,恢复正常调用;否则,继续保持熔断状态。
  • Sentinel:当熔断触发后,经过一定的熔断时长(可配置),尝试恢复对服务的调用。如果调用成功,则恢复正常;若再次失败,重新进入熔断状态。可通过控制台动态调整熔断恢复相关参数。