一个服务挂了,因为重试风暴,整个系统都被拖垮。超时和重试配置不当,是分布式系统中 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 一个完整的超时配置参考值

七、总结

  • 超时是分布式系统的第一道防线
  • “快速失败”优于”无限等待”