在餐厅等菜,等多久你会起身走人?多数人心里有条线,超线就走,还要决定要不要换家店再试。AI 服务端面对同样的抉择:一个请求迟迟不返回,什么时候放弃、放弃后通知谁、客户端要不要再试。超时处理做得糙,用户体验与系统资源两头受损,这篇把门道拆开讲。
先带走一个判断:超时的本质是止损点的显式声明。每一层都该明确说清楚「我最多等多久」,没声明的等待都是隐患,出了问题连排查入口都找不到。
超时是分层的
一次请求从客户端到结果返回,会经过多层,每层有自己的超时:连接超时管建连那几秒,读超时管等待响应的时间,网关层的总超时管整条链路的上限,后端各服务之间还有内部调用超时。分层的原则是外层大于内层之和——网关总超时要大于后端各环节超时的加总,否则后端还在干活,网关先放弃了,活白干还产生悬空状态。反过来的配置是常见事故源,排查时先画一遍各层超时的时间轴。
生成式响应的特殊之处
传统接口是「想好了一并返回」,生成式接口是边想边说:首字要等模型算完第一步,之后逐段吐出。所以超时设计要拆成两段——首字超时与整体超时。首字超时管「多久开始出结果」,用户对它的感知最敏锐;整体超时管「最多生成多久」,防止长输出无限占用资源。两段参数独立设置,不能沿用传统接口的单值超时,照搬是生成式服务最常见的配置错误。流式链路断开后的行为还与连接方式相关,见长连接和短连接是怎么选的?机制细节全梳理。
两段超时各守一段边界,与传统单值超时的分工不同。
| 超时段 | 管什么 | 设的时候注意什么 |
|---|---|---|
| 首字超时 | 多久开始出结果 | 用户对它的感知最敏锐 |
| 整体超时 | 最多生成多久 | 防止长输出无限占用资源 |
| 传统单值超时 | 想好了一并返回的接口 | 照搬到生成式是最常见的配置错误 |
重试与超时的配合
超时之后通常伴随重试,但配合不好会放大故障。三个要点:幂等先行,只对幂等请求自动重试,非幂等操作要先确认副作用,避免重复执行;退避节奏,连续重试要有间隔并逐次拉长,加上随机抖动,防止重试风暴同时砸向服务端;重试预算,给整条链路设重试比例上限,超限后直接失败返回,避免故障时重试流量雪上加霜。
入口处的重试流量还受闸门约束,分层控制见限流的配置分几层?全局与按用户。
一个超时参数的调法
调参不靠感觉,靠分布。把该接口历史响应时间的分布拉出来,看两个数:正常请求的尾部分位(比如 99% 的请求在多少毫秒内返回)与故障时段的表现。超时值设在尾部分位之后留出余量,而不是用平均值——平均数会骗人,少量长请求被平均掩盖。改完参数后盯一个指标:超时率应下降且成功率不降,若成功率反而下滑,说明新值截掉了本该成功的慢请求,回调一档再观察。超时数据落在监控里的哪个位置,挑指标的方法见监控大盘的指标是怎么挑的?关键步骤一次讲清;超时重试带来的重复调用也是成本项,算账方式见多模型的成本对比是怎么跑的?过程拆开看。
超时配置自查清单
- 各层超时是否满足「外层大于内层之和」
- 生成式接口是否拆分首字超时与整体超时
- 自动重试是否只作用于幂等请求
- 重试是否有退避与比例上限
- 参数调整是否基于响应时间分布而非平均值
关于服务端超时再多问三句
- 超时后请求还在服务端跑吗?:可能在,客户端放弃不等于服务端停止,所以后端要有配套的取消机制,及时回收算力。
- 超时设得越长越稳妥吗?:越长的超时意味着故障占用资源越久、用户干等越久,超时值是止损点,超出必要余量就是浪费。
- 接通义千问或 DeepSeek 接口时超时怎么定?:先查官方建议值作为起点,再用自己业务的真实流量压出分布微调,别直接抄别人的配置。


