高吞吐后端韧性工程:限流、熔断、背压与读写分离实战
2026-06-12 14:22:52
高吞吐后端韧性工程实战
案例背景:日活 500 万电商,大促峰值 8 万 QPS 下单请求
目标:核心链路可用性 99.95%,P99 < 300ms(非 AI)
一、韧性设计四支柱
┌─────────┐
请求 ──→ │ 限流 │ ──→ 拒绝超载,保护下游
└────┬────┘
↓
┌─────────┐
│ 熔断 │ ──→ 下游故障时快速失败
└────┬────┘
↓
┌─────────┐
│ 背压 │ ──→ 队列有界,不 OOM
└────┬────┘
↓
┌─────────┐
│ 隔离 │ ──→ 读写分离、舱壁线程池
└─────────┘
二、限流:Sentinel 规则设计
2.1 多层限流
| 层级 | 维度 | 阈值示例 |
|---|---|---|
| Gateway | 全站 IP | 100 req/s |
| Gateway | 用户 ID | 20 req/s |
| 服务 | 接口 | /order/create 5000 QPS |
| 服务 | 热点参数 | 商品 SKU 500 QPS |
2.2 热点参数限流
@SentinelResource(value = "createOrder", blockHandler = "createOrderBlock")
public Order createOrder(@HotParam Long skuId, OrderRequest req) {
return orderService.create(req);
}
public Order createOrderBlock(Long skuId, OrderRequest req, BlockException ex) {
throw new BizException("商品太火爆,请稍后再试");
}
Sentinel 控制台动态推送规则,生产环境建议规则 Git 化管理。
三、熔断与降级
Resilience4j 配置示例:
resilience4j.circuitbreaker:
instances:
inventoryService:
slidingWindowSize: 100
failureRateThreshold: 50
waitDurationInOpenState: 30s
permittedNumberOfCallsInHalfOpenState: 10
resilience4j.timelimiter:
instances:
inventoryService:
timeoutDuration: 2s
降级策略:
- 库存服务超时 → 返回「库存查询中,订单待确认」异步单
- 推荐服务失败 → 返回静态热门列表
- 核心下单链路禁止静默失败
四、消息队列背压
Producer → Kafka (partition=32) → Consumer (batch=100, max.poll=500ms)
背压信号:
- Consumer Lag > 10 万 → 暂停非核心 Producer
- 队列深度告警 → 前端展示「排队 N 人」
- 有界队列:
LinkedBlockingQueue(capacity=10000),满则拒绝
RocketMQ 消费失败进 DLQ,人工/自动补偿流程必备。
五、MySQL 读写分离
5.1 架构
写 → Master
读 → ShardingSphere 路由 → Slave1 / Slave2
强一致读 → 写后读 Master(同请求 ThreadLocal 标记)
5.2 延迟感知
Slave 复制延迟 > 1s 时,自动路由 Master 读,避免「下单成功但查不到」。
spring.shardingsphere.rules.readwrite-splitting:
data-sources:
ds0:
write-data-source-name: master
read-data-source-names: slave0,slave1
load-balancer-name: round_robin
六、缓存与热点 Key
| 问题 | 方案 |
|---|---|
| 缓存击穿 | 互斥锁 + 逻辑过期 |
| 缓存雪崩 | TTL 随机偏移 ± 10% |
| 热点 Key | Local Cache(Caffeine)+ Redis 双层 |
大促前 人工预热 TOP 100 SKU 缓存,CDN 静态化商品详情页。
七、压测验证
- 全链路压测:生产隔离影子库/影子 Topic
- 指标验收:限流触发率、熔断次数、Lag、P99
- 故障注入:Chaos Mesh 随机 Kill Pod
# wrk 压测示例
wrk -t12 -c400 -d60s -s create_order.lua https://api.example.com/order
八、运维 Runbook(节选)
现象:下单成功率骤降
- 查 Gateway 429 比例 → 是否限流过严
- 查 inventory 熔断状态 → 是否下游故障
- 查 Kafka Lag → 是否消费跟不上
- 查 MySQL 慢查询 → 是否锁等待
小结
高吞吐不是「堆机器」——限流保生存、熔断防扩散、背压防 OOM、隔离防牵连。国内大促实践表明,提前在 Gateway 层截断 30% 无效流量,比下游扩容成本低一个数量级。