高并发系统设计-服务降级

一、概述

1.1 什么是服务降级

服务降级(Fallback)指的是:

当系统压力过大或依赖服务不可用时,主动返回一个“可接受的替代结果”,而不是让请求失败。

例如:

正常:
→ 查询实时商品详情

降级:
→ 返回缓存商品详情 / 静态数据

1.2 降级和熔断的区别

项目熔断降级
目的防止故障扩散保证可用性
触发服务异常系统压力 / 异常
行为阻断调用返回替代结果
是否对外可用

熔断 = 不调用

降级 = 换一种方式返回

1.3 为什么需要服务降级

在高并发系统中:

资源永远是有限的。

例如:

数据库:1000 QPS,

实际请求:10000 QPS

如果不做降级:请求全部打到数据库-》系统崩溃

1.4 企业典型应用场景

场景1:商品详情页

正常: → 实时库存 + 价格 + 推荐

降级: → 缓存商品 + 默认库存

场景2:推荐系统

推荐服务挂了

→ 返回热门商品

场景3:搜索系统

ES不可用

→ 返回缓存结果 / 热门搜索

场景4:支付系统

支付服务异常

→ 返回“支付处理中”

二、原理

2.1 降级的核心思想

降级本质是:

用“低成本结果”替代“高成本依赖调用”

2.2 降级的触发条件

企业常见触发方式:

1.服务不可用

依赖服务超时 / 报错

2.系统压力过高

3.熔断触发

4.资源不足

2.3 降级策略类型

1.返回默认值

库存 = 9999

2. 返回缓存数据

Redis数据 / 本地缓存

3.返回静态页面

HTML缓存

4. 返回兜底数据(Fallback Data)

热门商品 / 推荐列表

5.功能关闭

关闭评论 / 推荐 / 排行榜

2.4 降级层级设计

企业通常分三层:

L1:核心功能(必须可用)
L2:重要功能(可降级)
L3:非核心功能(可关闭)

例如电商:

层级功能
L1下单 / 支付
L2商品详情 / 库存
L3推荐 / 评论 / 评分

三、实现

3.1 PHP 简单降级实现

class ProductService
{
    public function getDetail($id)
    {
        try {
            return $this->remoteClient->get($id);
        } catch (\Throwable $e) {

            return $this->fallback($id);
        }
    }

    private function fallback($id)
    {
        return Redis::get("product:$id")
            ? json_decode(Redis::get("product:$id"), true)
            : [
                'id' => $id,
                'name' => '系统繁忙,请稍后再试',
            ];
    }
}

3.2 降级 + 熔断组合

请求 → 熔断判断 → 调用服务 ↓失败 降级返回

3.3 API Gateway降级

用户请求 → Gateway → 服务异常 → 返回缓存