服务调用超时与重试配置
一个服务挂了,因为重试风暴,整个系统都被拖垮。超时和重试配置不当,是分布式系统中 80% 雪崩的元凶。
一、超时配置的层次
- 1.1 连接超时(Connect Timeout)——建立连接的超时
- 1.2 读取超时(Read Timeout)——等待响应的超时
- 1.3 请求超时(Request Timeout)——整个请求的总体超时
- 1.4 链路上各层超时的关系——Nginx → Gateway → RPC → DB
二、超时时间的计算
- 2.1 基于 P99 响应时间 + 一定 buffer
- 2.2 上下游超时的关系——下游超时 < 上游超时
- 2.3 Dubbo 的超时配置——
timeout属性 - 2.4 Feign 的超时配置——
connectTimeout/readTimeout
三、重试机制的设计
- 3.1 什么时候需要重试——网络抖动、临时故障
- 3.2 什么时候不能重试——非幂等写操作
- 3.3 重试次数——3 次是常见的上限
- 3.4 重试间隔——固定间隔 vs 指数退避
- 3.5 退避算法——
Base * 2^(attempt-1) + random
四、Dubbo 的重试机制
- 4.1
retries属性配置 - 4.2 幂等性判断——
@DubboService(retries = 0)用于非幂等 - 4.3 重试可能导致的超时雪崩
五、超时风暴与解决方案
- 5.1 超时风暴的形成——A 超时 → B 重试 → B 压力大 → B 也超时
- 5.2 限流保护——Sentinel / Hystrix
- 5.3 熔断机制——失败率达到阈值直接熔断
- 5.4 快速失败 vs 兜底逻辑
六、超时配置的最佳实践
- 6.1 Nginx 层:
proxy_connect_timeout+proxy_read_timeout - 6.2 Gateway 层:
spring.cloud.gateway.httpclient.response-timeout - 6.3 RPC 层:Dubbo
timeout+retries - 6.4 DB 层:
spring.datasource.hikari.connection-timeout - 6.5 一个完整的超时配置参考值
七、总结
- 超时是分布式系统的第一道防线
- “快速失败”优于”无限等待”
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 谜思录!