RestTemplate超时引发的血案 àì夳堔傛蜴生んèń 2022-04-21 16:12 458阅读 0赞 最近线上出了一次故障,收银台系统所有服务全部假死。订单量瞬时下降,造成很大损失。 故障总结,导致问题的原因有两方面: 数据库慢查询 ● RestTemplate超时时间设置不生效。 ● spring-web不同版本设置RestTemplate方式不完全一样。 默认超时设置 默认情况下是没有超时设置的,此时超时依赖两方面: 依赖TCP连接本身的超时时间(tcp空闲连接,超过一定时间,连接会被关闭)。 请求所经过的网络节点的超时时间。e.g. 中间经过nginx, nginx默认读取后端服务的超时时间是60s,所以超时时间在60s左右(日志显示稍微大一点,不会大很多)。 代码分析 例子 1. `long start = System.currentTimeMillis();` 2. `try {` 3. `RestTemplate restTemplate = new RestTemplate();` 4. `Map responseObject = restTemplate.getForObject(url, Map.class);` 5. `System.out.println(responseObject);` 6. `} catch (Exception e) {` 7. `Assert.assertNotNull(e);` 8. `System.out.println("timeout = " + (System.currentTimeMillis() - start));` 9. `}` 原因: RestTemplate继承自 HttpAccessor, 默认使用的 ClientHttpRequestFactory是 SimpleClientHttpRequestFactory [原文链接][Link 1] [Link 1]: http://click.aliyun.com/m/1000026096/
还没有评论,来说两句吧...