Featured image of post 超时异常处理指南

超时异常处理指南

Java 程序中超时异常的介绍以及处理建议

超时异常,指一个操作未能在规定的时间内完成,抛出的异常。

常见超时异常

Connection timeout

当一个客户端尝试连接到一个服务器时,等待服务器响应的时间超过了预设的最长时间,导致建立连接失败。通常是由于网络拥塞或服务器繁忙引起的。

Socket timeout

当客户端和服务器建立连接后,一段时间内没接收到数据,则抛出该异常。

比如设置超时 100ms,服务器向客户端发送数据,每个数据包的发送间隔不能超过 100ms,否则报错。

Read timeout

当一个客户端从服务器端读取数据时,在一定时间内没有接收到任何数据,则会出现读取超时异常。 通常是由于网络连接中断、服务器响应慢或网络防火墙设置问题引起的。

请求链路

api-request-chain

以一个简单的请求举例,SLB 和 Gateway 的超时时间都是 60 秒(其实是 Gateway 向 SLB 看齐),Nginx 由于历史遗留原因超时为 300 秒,但整体还是 60 秒,不管后端设置的请求超时时间是多少,处理需要多久,都需要在 60 秒之内返回,否则网关会把该请求以超时处理。即:

api-gateway-504

处理流程之 Read timeout

  1. 检查处理过程中是否调用了慢接口
  2. 请求工具是否设置了超时时间
  3. 如设置了超时时间,仍超时,需要检查超时时间是否生效
  4. 是否接口异常,且设置了过大的重试次数

如何设置超时时间及重试次数

比如一个接口,平均耗时为 3s,3s 可以作为参考,建议手动请求 10 次或者更多,取耗时最长的一次再稍微向上取整,假设最长耗时 8s,则设置超时时间为 10s,已经能够覆盖这个接口大部分的响应耗时。10s 的情况能够重试 5 次,还在超时范围之内,重试 5 次都不能成功,则将异常返回给用户,让用户决定是否继续重试。

使用 Hugo 构建 主题 StackJimmy 设计
发表了 32 篇文章・ 总计 66.22 k 字
本站总访问量 · 总访客数
本博客已稳定运行 🧡