本文目录导读:
这是一个很实用的问题,超时时间没有“万能公式”,合理设定取决于业务场景、用户体验、系统负载三者之间的平衡。
下面提供一个从粗到细的设定思路,以及常见的参考值。
核心原则:快失败优于慢成功
如果请求注定失败(如网络断开、服务器挂了),让用户等30秒才报错,比1秒就报错体验更差,尽快让用户知道失败,他们才能做下一步操作(如重试、刷新)。
按业务场景设定(最直观的方法)
| 场景 | 建议超时时间 | 原因 |
|---|---|---|
| 读接口 / 查询 | 3-10 秒 | 用户期望秒开,超过5秒,绝大多数用户会离开,通常设 5秒 为“硬超时”。 |
| 写 / 提交操作 | 10-30 秒 | 用户愿意为“提交成功”多等一会儿,但如果超过30秒,他们可能以为提交失败并重复点击。 |
| 上传文件(较大) | 60 秒 或 更长 | 取决于文件大小和网速,更推荐用 上传进度条 替代固定超时,或者按 速度估算(如5MB/分钟)。 |
| 下载文件 | 不设超时 或 5分钟以上 | 同样推荐进度条,如果必须设,建议设一个很长的值(如120秒)或基于网速动态计算。 |
| 批量/后台任务 | 30 秒到几分钟 | 这类任务应由后端异步处理(如“任务已提交,稍后查询结果”),前端不应长时间等待。 |
| 第三方API调用 | 3-5 秒 | 外部接口不可控,快速失败可以保护自己的系统资源。 |
| 数据库查询(内部) | 5-15 秒 | 超过15秒的查询大概率是SQL性能问题,该优化而不是延长超时。 |
| WebSocket/长连接 | 存活检测 ping/pong (30-60秒) | 不是一次请求的超时,而是定期检查连接是否还活着。 |
按系统层级设定(分层防护)
一个请求可能经过客户端 -> 网关/负载均衡 -> 应用服务器 -> 数据库/第三方服务,每一层都应有自己的超时:
-
客户端超时(用户体验层)
- 最安全,但最“硬”:用户点击后,如果倒计时结束,直接显示“请求超时,请重试”。
- 建议值:通常等于或略大于(1.2倍)下一层的超时时间。
-
网关/反向代理超时(如 Nginx, API Gateway)
- 防护层:防止慢请求耗尽服务器连接池。
- 建议值:
proxy_read_timeout = 10s,proxy_send_timeout = 10s,通常比应用服务器超时短几秒。
-
应用服务器超时(处理业务逻辑)
- 核心:决定一次完整业务处理(调用DB+逻辑计算)的最大时间。
- 建议值:
5-15s,根据业务复杂性调整。
-
依赖服务/数据库超时(最小单位)
- 最严格:这个超时应该比应用服务器超时短,比如应用层是5秒,数据库连接超时设为3秒。
- 原因:如果数据库没反应,应用层能在3秒内拿到失败,而不是空等5秒后才知道。
最佳实践:严格度递减
客户端超时 (10s) > 网关超时 (8s) > 应用超时 (5s) > 数据库超时 (3s)
这样,最慢的环节(数据库)会最先触发超时,从而快速失败,避免其他层无限等待。
更高级的设定方法
基于百分位数的动态超时(P99)
通过监控系统,观察过去几天该接口的P99(99%的请求在多少秒内完成)。
- 接口A:P99 = 200ms,P90 = 100ms。
- 合理超时:500ms - 1s,这远大于P99(200ms),足够覆盖几乎所有正常请求。
- 如果有人请求超过1秒,基本是异常,不需要为异常延长超时。
增加重试机制(Retry)
观点:与其设一个很长的超时,不如设一个较短的超时,并配合几次快速重试。
- 方法:超时 = 15秒,如果失败,1秒后重试第1次,2秒后重试第2次。
- 效果:可以解决暂时的网络抖动,如果3次都超时,那就是真有问题,用户也能较快知道结果。
出现进度条或等待提示
对于必然慢的操作(如生成报表、发邮件),不要用超时。
- 做法:点击后立即返回“任务ID”,前端开始轮询或使用WebSocket查询状态。
- 效果:用户看到进度条,避免了“超时惩罚”,可以在前端设一个较长的心跳超时(如30秒无反馈则提示),但核心等待逻辑在后端。
避坑指南
- 不要设得太长(>30秒):除非有明确的进度反馈,否则用户会怀疑死机,然后疯狂刷新,导致雪崩。
- 不要不设超时(∞):这是最危险的,一个慢请求可能耗尽所有线程,导致整个系统瘫痪。
- 区分“连接超时”和“读取超时”:
connectTimeout(连不上服务器):通常很短,1-3秒,连不上就是连不上。readTimeout(连上了,但响应慢):可以长一些,5-15秒,给服务器处理时间。
- 超时异常要优雅处理:超时后,不要只显示“错误500”,应明确提示:“服务器响应超时,建议稍后重试。”
总结建议表(快速参考)
| 参数 | 推荐值(开发/测试) | 生产环境参考 |
|---|---|---|
| 连接超时 | 1-3 秒 | 通过监控,设为 P99 + 2s |
| 读/查询接口 | 5-10 秒 | 3-5 秒 |
| 写/提交接口 | 10-30 秒 | 10 秒,配合重试 |
| 文件上传 | 60 秒 + 进度条 | 动态计算,或设较大值 |
| 文件下载 | 无超时 / 半小时 | 无超时,靠心跳保活 |
| 第三方API | 3-5 秒 | 根据SLA设最坏情况 |
| 数据库查询 | 5-15 秒 (甚至更短) | 利用数据库自身statement_timeout |
最终黄金法则:先设定一个相对偏短的值(比如查询统一设5秒),然后通过线上监控(P99、超时率)和用户反馈,再针对性微调到合理的数值。