什么地方要超时与重试

对于Web应用,一般调用链如下:

发生超时一般是由于网络原因或远程服务响应过慢等原因造成的,可以分为以下几类:

  • 代理层超时与重试:如Haproxy、Nginx、Twemproxy,这些组件实现代理功能,如Haproxy和Nginx可以实现请求的负载均衡。而Twemproxy可以实现Redis的分片代理。需要设置代理与后端真实服务器之间的网络连接/读/写超时时间。

  • Web容器超时:如Tomcat、Jetty等,提供HTTP服务运行环境的。需要设置客户端与容器之间的网络连接/读/写超时时间,和在此容器中默认Socket网络连接/读/写超时时间。

  • 中间件客户端超时与重试:如JSF(京东SOA框架)、Dubbo、JMQ(京东消息中间件)、CXF、Httpclient等,需要设置客户的网络连接/读/写超时时间与失败重试机制。

  • 数据库客户端超时:如Mysql、Oracle,需要分别设置JDBC Connection、Statement的网络连接/读/写超时时间。事务超时时间,获取连接池连接等待时间。

  • NoSQL客户端超时:如Mongo、Redis,需要设置其网络连接/读/写超时时间,获取连接池连接等待时间。

  • 业务超时:如订单取消任务、超时活动关闭。还有如通过Future#get(timeout,unit)限制某个接口的超时时间。

  • 前端Ajax超时:浏览器通过Ajax访问时的网络连接/读/写超时时间。

内容来源

《亿级流量网站架构核心技术》:超时与重试机制

Last updated