超时与 deadline
连接/读/写超时;gRPC deadline 对照。
25 分钟
超时与 deadline
没有超时的调用,在依赖变慢时会 占住线程直到永远——级联失败的第一帮凶。超时 给每次调用设 上限时间;deadline 把预算沿调用链 向下传递,子调用不能超过剩余时间。
学习目标
- 区分连接超时、读超时、写超时
- 理解 deadline 在链路中的传递
- 配置 Spring Boot / Feign / Nginx 超时
三类超时
| 类型 | 含义 | 典型值(内网) |
|---|---|---|
| Connect | TCP 握手完成 | 1~3s |
| Read | 等待响应体 | 按 P99 + 余量 |
| Write | 发送请求体 | 大上传单独调 |
# application.yml — RestTemplate / WebClient
spring:
datasource:
hikari:
connection-timeout: 3000
validation-timeout: 2000
Feign 超时见 sc-feign;Gateway 见 sc-gateway。
Deadline 传递
用户 deadline = 3s
│
├─ backend 处理预算 2.8s
│ ├─ 调 course-svc 预算 1s ← 不能超过父剩余
│ └─ 查 MySQL 预算 500ms
│
└─ 超时则立即 504,释放线程
gRPC 原生支持 context deadline;HTTP 可用 X-Request-Timeout 等约定(团队统一即可)。
宝塔 Nginx 层
# 概念配置 — 保护 upstream 不被拖死
proxy_connect_timeout 3s;
proxy_read_timeout 30s;
proxy_send_timeout 30s;
Nginx 超时应 略大于 backend 自身超时,否则 backend 还在处理、Nginx 已断连,造成 重复请求。
与重试、熔断的关系
超时 → 触发重试?(仅 transient + 幂等)
→ 连续超时 → 熔断 OPEN([rel-circuit](/tracks/reliability-essentials/lessons/rel-circuit))
→ 用户侧降级
练习
- 列出 CodeRoadMap 四条链路的建议 read timeout
- 解释「Nginx 超时 < backend 超时」的问题
- 对照 rel-cascade 画线程释放时序