5月27日 23:24
RPC 调用中的容错机制有哪些?
核心容错策略有哪些?
RPC 调用面临网络抖动、服务宕机、过载等故障,容错机制围绕快速失败和优雅降级两个原则展开,主要包括超时、重试、熔断、限流、降级五种策略。
超时与重试:第一道防线
超时防止调用方无限阻塞。需区分连接超时和读取超时,根据 P99 延迟动态调整。Dubbo 的 timeout、gRPC 的 deadline 是典型实现。
重试应对临时性故障(网络抖动、GC 停顿),但必须满足两个前提:
- 接口幂等:重复调用不产生副作用,可通过唯一请求 ID 保证
- 退避策略:指数退避(1s → 2s → 4s)避免重试风暴
java// Dubbo 重试配置示例 @DubboReference(retries = 2, timeout = 3000) private UserService userService;
面试追问:非幂等接口(如下单)如何重试?——不重试,改用异步确认或 TCC 补偿。
熔断:防止故障雪崩
当下游故障率超过阈值,熔断器主动切断调用,直接返回失败,避免大量请求堆积拖垮上游。
三个状态转换:
- Closed → 正常调用,统计失败率
- Open → 失败率超阈值,快速失败,不发起调用
- Half-Open → 经过恢复时间窗口后,放少量请求探测,成功则回 Closed,失败则回 Open
实现:Hystrix(已停更)、Resilience4j、Sentinel。
关键参数:失败率阈值(如 50%)、超时时间、恢复窗口。
限流与降级:保护与兜底
限流从入口控制流量,核心算法对比:
| 算法 | 特点 | 适用场景 |
|---|---|---|
| 令牌桶 | 允许突发流量,匀速生成令牌 | 一般业务 |
| 漏桶 | 严格匀速输出 | 流量整形 |
| 滑动窗口 | 精确统计窗口内请求数 | 精确限流 |
降级在服务不可用时提供兜底方案:返回缓存数据、默认值或简化逻辑。与熔断的区别——熔断是切断调用,降级是提供替代结果,两者常配合使用。
如何组合使用?
生产环境通常多层组合:
- 入口限流 → 防止流量冲击
- 调用超时 + 重试 → 应对临时故障
- 熔断 + 降级 → 防止级联失败
- 隔离(线程池/信号量)→ 防止单服务耗尽资源
按业务重要性分级配置:核心链路(支付)用严格熔断+快速降级;非核心链路(推荐)可放宽重试、允许失败。