高并发系统设计-服务降级
一、概述
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 → 服务异常 → 返回缓存