超时异常,指一个操作未能在规定的时间内完成,抛出的异常。
常见超时异常
Connection timeout
当一个客户端尝试连接到一个服务器时,等待服务器响应的时间超过了预设的最长时间,导致建立连接失败。通常是由于网络拥塞或服务器繁忙引起的。
Socket timeout
当客户端和服务器建立连接后,一段时间内没接收到数据,则抛出该异常。
比如设置超时 100ms,服务器向客户端发送数据,每个数据包的发送间隔不能超过 100ms,否则报错。
Read timeout
当一个客户端从服务器端读取数据时,在一定时间内没有接收到任何数据,则会出现读取超时异常。 通常是由于网络连接中断、服务器响应慢或网络防火墙设置问题引起的。
请求链路
以一个简单的请求举例,SLB 和 Gateway 的超时时间都是 60 秒(其实是 Gateway 向 SLB 看齐),Nginx 由于历史遗留原因超时为 300 秒,但整体还是 60 秒,不管后端设置的请求超时时间是多少,处理需要多久,都需要在 60 秒之内返回,否则网关会把该请求以超时处理。即:
处理流程之 Read timeout
- 检查处理过程中是否调用了慢接口
- 请求工具是否设置了超时时间
- 如设置了超时时间,仍超时,需要检查超时时间是否生效
- 是否接口异常,且设置了过大的重试次数
如何设置超时时间及重试次数
比如一个接口,平均耗时为 3s,3s 可以作为参考,建议手动请求 10 次或者更多,取耗时最长的一次再稍微向上取整,假设最长耗时 8s,则设置超时时间为 10s,已经能够覆盖这个接口大部分的响应耗时。10s 的情况能够重试 5 次,还在超时范围之内,重试 5 次都不能成功,则将异常返回给用户,让用户决定是否继续重试。