在实际开发当中,很多故障的产生都是因为没有意识到超时设置的重要性而造成的。如果不设置超时机制,就有可能导致连锁反应,最终系统雪崩。有些中间件天然集成了超时重试的机制,但是在设计当中需要注意的是:读服务非常适合重试,但是写服务大多不能重试。为了解决写操作的重试问题,一般情况下会使用“幂等重试”的方式。但是跨系统调用又不能无限次数的重试,这里面就需要设置合理的重试次数,并且配合熔断、快速失败等机制。
重试的分类
从系统调用的整个链路来看,可以将其分为以下几种类型。
- 代理层超时重试:如Haproxy、Nginx等。这里面需要合理的设置代理与后端真实服务之间的网络连接/读/写的超时时间。
- Web容器超时:如Tomcat、Jetty等。应用服务器需要设置客户端与容器之间的网络连接/读/写超时时间。以及默认Socket网络连接/读/写的超时时间。
- 中间件客户端超时重试:如Dubbo、HTTPClient等。需要设置客户端的网络连接/读/写超时时间与重试机制。
- 数据库客户端超时:如MySQL、MongoDB、Redis等。需要分别设置JDBC Connection、Statement的网络连接/读/写超时时间,事务超时时间,获取连接池连接等待时间。
- 前端Ajax超时:浏览器通过Ajax访问时的网络连接/读/写超时时间。
Nginx 代理层超时
Nginx(Open