API调用超时怎么解决?
遇到接口请求超时,怎样区分连接、读取、服务处理和客户端总时长问题,并判断是否可以安全重试?
4个回答
先定位是哪一段在等,再处理那一段。记录一次请求的开始、连接完成、首字节和结束时间,并按请求ID对照服务端日志。DNS或连接阶段就失败,先查域名、网络和TLS;连接成功后长时间没响应,继续查服务端排队和上游等待。首字节耗时还包含前面的连接过程,不能直接当成模型生成时间。
超时配置要对照实际触发的那一层,不能只把客户端等待时间调大。curl的--connect-timeout管连接阶段,--max-time管一次传输总时长;应根据正常耗时和业务可接受的等待上限设置。若使用NGINX反向代理,proxy_read_timeout限制的是两次读取上游数据之间的等待,不是整次响应的总时长。先查日志确认谁中断,再调整对应配置。
看到 HTTP 状态码时,要结合响应和服务端记录判断:408表示服务器没有及时收到完整请求,504表示网关等待上游响应超时。若客户端直接报超时而没有收到状态码,不能据此断定服务端没有执行;服务端可能已收到请求并完成或正在完成处理。
能否重试,要看接口是否允许重复执行,而不只看有没有收到结果。创建任务等非幂等请求超时后,先用任务ID或业务流水号查状态;服务方支持幂等键时,按其文档处理同一次操作。即使只是文本生成,重发也可能重复计费。确认可重试后,再设有限次数、逐步增加的等待和总耗时上限,避免多个客户端同时连续重发。