如何设置超时与重试机制

2020-05-19  本文已影响0人  先生zeng

在实际开发中,很多故障都是没有设置超时和设置超时和重试机制不正确导致的故障,如果应用不设置超时,则可能会导致请求响应慢,慢请求慢慢累积会造成雪崩。有些中间件和框架基本都会默认进行重试,读服务天然适合重试,写服务需要看是否设置幂等,如果设置了,则重试就是允许的。我们还需要控制重试的次数,不能够太多,导致会模拟了DDos攻击了。

一般来说,在配置合理的重试机制,还需要跟熔断和快速失败机制配合。

具体可以看下图:



这张图是一个典型的web应用开发的整体链路模式。我们在每一个点都可以设置。
最重要的超时设置是网络连接/读/写的超时时间设置。

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

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

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

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

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

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

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

对于后端开发人员来说,比较重要的还是设置网络相关的超时设置,如果业务、sql、nosql等。

代理层的重试与超时设置

对于代理层,一般以nginx为例,Nginx主要有4类超时设置:

客户端超时设置
DNS解析超时设置
代理超时设置
使用ngx_lua, 还有Lua相关的超时设置

上一篇下一篇

猜你喜欢

热点阅读