调用远程服务的超时现象

  刚刚做完一个网站项目,网站的显示数据是通过远程服务获取的,过程比较“曲折”,如下图所示。

  项目使用spring
mvc来开发,其中需要请求rest服务,使用spring提供的RestTemplate类可以很方便的实现rest请求发送和响应结果接收。中间系统属于老版本的系统,采用的是php开发的。在测试过程中,发现网站上的数据显示极其不稳定,时不时地提示远程数据获取失败。使用http监听工具进行了追踪,是中间系统向网站响应的结果是链接超时,导致了网站解析响应结果时没有获取到数据。将中间系统的超时阀值调大后,中间系统可以正确地响应数据,可是网站仍然无法解析数据,后来发现RestTemplate的ReadTimeout设置的值太低,导致未能接受数据。同时将RestTemplate的ReadTimeout的值调大后,一切运行正常。

  这里记录、强调的重要一点使我们开发人员的主观意识错误,导致于排除错误时未能快速定位错误原因。为什么这么说呢?网站使用的是spring
mvc,RestTemplate的ReadTimeout值设置的为5秒,开发人员个人觉着拿到数据为null的响应没有等到5秒啊,怎么会超时呢?同样,中间系统是php开发的,而php开发人员设置的超时时间为15秒,也是个人觉着15秒拿数据怎么也够了呀,怎么会超时呢?

  让真实数据和实践来说话!http监听工具可以查看每次请求的timeline,两个系统的开发人员分别仔细观察了各自请求的时间,平均在19秒左右!

  说到这里,其实最想说明是,不要被我们自己的主观意识蒙蔽了双眼。为什么会出现上述的现象?在项目开发后期,特别是时间吃紧的状况下,开发人员在调试诸多问题的过程中,很容易地就想当然了,忽略了解决问题的本质。只有通过对真实数据的分析及实践操作,才能准确快速地找到问题原因!

  所以,在任何情况下,一定要养成冷静思考的好习惯,一定要充分利用调试工具的功能,千万不要自己觉着!

时间: 2024-10-05 16:28:50

调用远程服务的超时现象的相关文章

本地应用调用远程服务中的方法

*  AIDL:安卓接口定义语言 ,来公开服务的接口的方式来暴露服务接口* IPC:进程间通讯 intel-process communication* AIDL编写步骤: 远程工程 1. 把IRemoteService.java接口改成.aidl的接口 2. 去掉.aidl接口文件的权限修饰符public 3. 让远程服务里的内部类继承Stub package com.example.alipay; import android.app.Service; import android.cont

SpringCloud03 Ribbon知识点、 Feign知识点、利用RestTemplate+Ribbon调用远程服务提供的资源、利用feign调用远程服务提供的资源

1 远程服务资源的调用 1.1 古老的套路 在微服务出现之前,所有的远程服务资源必须通过RestTemplate或者HttpClient进行:但是这两者仅仅实现了远程服务资源的调用,并未提供负载均衡实现,所以程序员必须自己实现负载均衡功能:而且当远程服务是集群部署时,利用RestTemplate或者HttpClient封装的客户端必须配置好远程服务的先关信息. 技巧01:利用Spring5.X 提供的WebClient可以实现响应式访问远程服务资源    技巧02:利用RestTemplate和

绑定服务调用远程服务中的方法

在Andorid平台中,各个组件运行在自己的进程中,他们之间是不能相互访问的,但是在程序之间是不可避免的要传递一些对象,在进程之间相互通信.为了实现进程之间的相互通信,Andorid采用了一种轻量级的实现方式RPC(Remote Procedure Call 远程进程调用)来完成进程之间的通信,并且Android通过接口定义语言(Andorid Interface Definition Language ,AIDL)来生成两个进程之间相互访问的代码,例如,你在Activity里的代码需要访问Se

JS中的间歇调用setInterval()与超时调用setTimeout()相关总结

超时调用需要使用window.setTimeout(code,millisec)方法 它接受两个参数:要执行的代码和以毫秒表示的时间(即在执行代码前需要等待多少毫秒).其中第一个参数可以是一个包含JS代码的字符串(就和在eval()函数中使用的字符串一样),也可以是一个函数.第二个参数表示等待多长时间的毫秒数,但经过该事件后指定的代码不一定会执行. 这是因为JS是一个单线程序的解释器,一定时间内只能执行一段代码,为了控制要执行的代码就有一个JS任务队列,这些任务会按照将他们添加到队列的顺序执行.

设置调用方法的超时时间

在工作中,遇到这样一个需求,我要做一个业务,要验证一下现有的数据是否正确,但这个验证又不是必须的,只是说如果这里验证不通过,后面流程就可以不走了,但是如果这里没有验证到,后面也会有验证.也就是说不影响主流程,算得上是一个优化吧.比如我要查询一个东西,但是这个时间不能超过1秒. 在网上查了一下,基本上都是异步执行,有两个线程来做.我查到有两种方法. 第一种 独立成一个类 代码如下: (1).FuncTimeOut类 /// <summary> /// 超时设置类 /// </summary

C#调webservice超时;结果:C#调用webservice服务超时

方法/步骤 首先修改服务端配置 WebService服务所在站点为服务端,它提供了服务,打开这个站点的web.config,添加下面的配置: <httpRuntime  executionTimeout="300000" /> <compilation defaultLanguage="c#" debug="false"> executionTimeout="300000" 单位是“毫秒”,这里配置的是

开发Portlet第三步:如何在Crystal Portlet中调用远程服务?

当基于测试数据的Portlet调试完成后,接下来就是引入远程服务,替换测试数据. (此处以Dubbo框架远程服务为例) 分步指南 删除测试数据依赖:在pom.xml文件中,删除对****-service-stub项目的依赖. 添加远程服务依赖:在pom.xml文件中,添加对实际远程服务项目提供的客户端包的依赖: 加载Portlet,调试运行是否正常. 注意事项 当出现无法获取远程服务对象,而出现NullPointException时,请检查对应的****-portlet.xml文件中,是否包含以

python调用函数设置超时机制

有时候需要给函数设置超时机制,以防止它卡住我们的程序,这里可以用python的signal模块,signal模块可以实现程序内部的信号处理. # coding:utf8 import time import signal # 自定义超时异常 class TimeoutError(Exception): def __init__(self, msg): super(TimeoutError, self).__init__() self.msg = msg def time_out(interval

公网底图调用投影问题怪现象

公网上用的底图,如天地图.谷歌地图.高德地图,都是EPSG:3857投影(web墨卡托投影),但如果强行改为EPSG:4326会怎样呢?下面我以三个部分一一展示 Part 1.投影成EPSG:3857,一切正常 以google矢量底图为例,直接openlayers上代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta nam