MST

星途 面试题库

面试题:微服务架构下,如何设计一个通用的服务降级策略以应对高并发场景下的服务过载?

假设你负责的微服务系统面临高并发流量,部分服务可能因过载而响应缓慢甚至崩溃。请设计一个通用的服务降级策略,考虑如何识别过载、哪些服务应优先降级、如何保证降级后核心业务的可用性,以及如何通过代码和配置来实现该策略。
12.5万 热度难度
后端开发微服务架构

知识考点

AI 面试

面试题答案

一键面试

1. 识别过载

可以通过以下几种方式识别服务过载:

  • 基于资源指标
    • CPU使用率:通过操作系统或容器监控工具(如Prometheus + Grafana)实时获取CPU使用率。当CPU使用率超过设定阈值(如80%),可认为服务有过载风险。
    • 内存使用率:类似地,监控内存使用情况,当内存使用率达到特定比例(如90%),表明可能过载。
    • 线程数:对于Java应用,可监控线程池的活跃线程数。若活跃线程数接近或达到线程池最大线程数,可能面临过载。
  • 基于请求指标
    • 请求响应时间:统计一段时间内(如1分钟)请求的平均响应时间。若平均响应时间大幅超过正常水平(例如超过平时的2倍),说明服务可能过载。
    • 请求队列长度:如果请求队列持续增长且不下降,表明服务处理速度跟不上请求速度,可能处于过载状态。

2. 优先降级的服务

  • 非核心业务服务:例如,一些辅助性的功能,如用户个性化推荐(但不影响基本产品浏览和交易)、第三方广告展示等服务。这些服务即使暂时不可用,对核心业务影响较小。
  • 资源消耗大且可替代的服务:比如复杂的数据分析计算服务,如果有简单版本的计算方式可满足基本需求,那么复杂计算服务可优先降级。
  • 依赖外部不稳定服务的业务:若某个服务依赖于外部接口,而该接口经常不稳定,为避免影响自身系统,可考虑优先降级此服务。

3. 保证核心业务可用性

  • 业务梳理与分级:对整个微服务系统的业务进行详细梳理,明确区分核心业务和非核心业务。例如电商系统中,商品展示、下单、支付属于核心业务,而用户积分兑换等属于非核心业务。
  • 资源隔离:通过容器化(如Docker)和资源限制(如Kubernetes的资源配额),确保核心业务服务有足够的CPU、内存等资源,不会因其他服务过载而受影响。
  • 备用方案:为核心业务服务准备备用方案,如缓存策略。当核心业务服务依赖的其他服务降级时,可从缓存中读取数据以维持基本功能。例如,商品详情页面的数据,可先从Redis缓存读取。

4. 代码实现

以Java Spring Cloud为例,使用Hystrix库实现服务降级:

  • 引入依赖
<dependency>
    <groupId>com.netflix.hystrix</groupId>
    <artifactId>hystrix-core</artifactId>
    <version>1.5.18</version>
</dependency>
<dependency>
    <groupId>com.netflix.hystrix</groupId>
    <artifactId>hystrix-metrics-event-stream</artifactId>
    <version>1.5.18</version>
</dependency>
  • 定义服务方法和降级方法
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.stereotype.Service;

@Service
public class ExampleService {

    @HystrixCommand(fallbackMethod = "fallbackMethod")
    public String exampleMethod() {
        // 正常业务逻辑
        return "正常响应";
    }

    public String fallbackMethod() {
        // 降级逻辑
        return "服务降级,返回兜底数据";
    }
}
  • 启用Hystrix:在Spring Boot主类上添加@EnableHystrix注解:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.netflix.hystrix.contrib.javanica.annotation.EnableHystrix;

@SpringBootApplication
@EnableHystrix
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

5. 配置实现

以Spring Cloud Netflix Hystrix为例,在application.yml文件中进行配置:

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 5000 # 设置超时时间,单位毫秒
      circuitBreaker:
        requestVolumeThreshold: 10 # 在滚动时间窗内,请求数达到此值,断路器才会开启
        errorThresholdPercentage: 50 # 错误率达到此值,断路器开启
        sleepWindowInMilliseconds: 5000 # 断路器开启后,休眠时间,单位毫秒

通过这些配置,可以灵活调整服务降级策略的触发条件和行为。同时,结合监控工具(如Hystrix Dashboard)实时监控服务的运行状态,及时调整配置以适应不同的流量场景。