最近线上出了一次故障,收银台系统所有服务全部假死。订单量瞬时下降,造成很大损失。
故障总结,导致问题的原因有两方面:
数据库慢查询
● RestTemplate超时时间设置不生效。
● spring-web不同版本设置RestTemplate方式不完全一样。
默认超时设置
默认情况下是没有超时设置的,此时超时依赖两方面:
依赖TCP连接本身的超时时间(tcp空闲连接,超过一定时间,连接会被关闭)。 请求所经过的网络节点的超时时间。e.g. 中间经过nginx, nginx默认读取后端服务的超时时间是60s,所以超时时间在60s左右(日志显示稍微大一点,不会大很多)。
代码分析
例子
-
long start = System.currentTimeMillis();
-
try {
-
RestTemplate restTemplate = new RestTemplate();
-
Map responseObject = restTemplate.getForObject(url, Map.class);
-
System.out.println(responseObject);
-
} catch (Exception e) {
-
Assert.assertNotNull(e);
-
System.out.println("timeout = " + (System.currentTimeMillis() - start));
-
}
原因: RestTemplate继承自 HttpAccessor, 默认使用的 ClientHttpRequestFactory是 SimpleClientHttpRequestFactory