RestTemplate超时引发的血案

àì夳堔傛蜴生んèń 2022-04-21 16:12 605阅读 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

原文链接

发表评论

表情:
评论列表 (有 0 条评论,605人围观)

还没有评论,来说两句吧...

相关阅读

    相关 参数名引发血案

    概况 今天在解决一个Bug时,修改了原先的SQL语句,在数据库执行通过之后,复制到了项目中,使用MyBatis进行查询,却屡屡报错,现在把解决问题的过程记下来 报错信

    相关 一个“-”引发血案

    也许你永远遇不到这样的bug的,但是你要知道什么bug都有,所以不要惊讶! 简化场景: 拼接了这样一个字符串:1.2,2.3,0.4-flag(三个double值用逗

    相关 一个Sqrt函数引发血案

    好吧,我承认我标题党了,不过既然你来了,就认真看下去吧,保证你有收获。   我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过: