RestTemplate超时引发的血案

最近线上出了一次故障,收银台系统所有服务全部假死。订单量瞬时下降,造成很大损失。

故障总结,导致问题的原因有两方面:

数据库慢查询

 ●  RestTemplate超时时间设置不生效。

 ●  spring-web不同版本设置RestTemplate方式不完全一样。

默认超时设置

默认情况下是没有超时设置的,此时超时依赖两方面:

依赖TCP连接本身的超时时间(tcp空闲连接,超过一定时间,连接会被关闭)。 请求所经过的网络节点的超时时间。e.g. 中间经过nginx, nginx默认读取后端服务的超时时间是60s,所以超时时间在60s左右(日志显示稍微大一点,不会大很多)。

代码分析

例子

 
  1. long start = System.currentTimeMillis();

    扫描二维码关注公众号,回复: 4248418 查看本文章
  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

原文链接

猜你喜欢

转载自blog.csdn.net/weixin_40581617/article/details/84539731