蓝盟IT外包专家
1超时,不可避免的疼痛
HTTP调用通过HTTP协议执行一次网络请求。 既然是网络请求,就有可能超时(有些网卡和服务器安装在其中)。 因此,开发需要注意。
框架设置的默认超时时间是否合理。
太短了,要求还没有处理,你等不及了!
太长了,请求已经挂起超过正常响应时间。
考虑到网络的不稳定性,超时后可以在计时器任务中请求重试。
请注意服务器端接口的幂等设计,即是否允许重试。
考虑到框架是否像浏览器一样限制并发连接数,避免高同时HTTP调用的并发数成为瓶颈。
1.1 HTTP呼叫框架技术选型
Spring Cloud家族桶
使用Feign进行声明性的服务呼叫。
只使用Spring Boot
HTTP客户端Apache http客户端进行服务呼叫。
1.2连接超时设定读取超时参数。
连接超时参数ConnectTimeout
建立可定制配置的连接最大等待时间
读出超时参数ReadTimeout
控制从套接字读取数据的最大等待时间。
1.3常见基坑
连接超时配置太长了
比如60s。TCP三次握手正常建立连接所需的时间很短,在ms级到最大s级,不能需要十几、几十秒。 大部分是网络或防火墙的配置问题。 这个时候如果连不到几秒钟,可能永远连不到。 因此,设定特别长的连接超时没有意义,1~5秒即可。
如果是纯内部网呼叫,也可以设定得更短。 如果下游服务无法连接,它将立即失败。
无脑故障诊断连接超时问题
服务器通常有多个节点,但当其他客户端通过负载平衡连接到服务器时,客户端和服务器将直接建立连接。 在这种情况下,连接超时很大
另一方面,在服务器侧通过Nginx反向代理进行负载平衡的情况下,客户端不是与服务器侧而是与Nginx连接,因此在发生连接超时的情况下,对Nginx进行故障排除
读出超时参数和读出超时“坑”
如果读出超时,服务器端程序的正常执行一定会中断吗?
Tomcat Web服务器是向线程池提交服务器端请求的过程,只要服务器端收到请求,网络级超时和断开就不会影响服务器端的执行。 因此,由于读出超时,有时不能随便设想服务器端的处理,有必要根据业务状态考虑如何进行后续的处理。读出超时是套接字网络级的概念,数据传输最需要时间,因此其配置较短
比如100ms
发生读取超时,无法在网络级别区分以下原因。
服务端没有把数据回复给客户端。
数据在网络上很花时间或者有数据包丢失。
但是,TCP是在连接建立完成后传输数据的,不是网络状况特别差的服务呼叫,可以考虑如下。
连接超时。
网络问题和服务不在线。
读取超时。
服务处理超时了。 读出超时是指向套接字写入数据后,到套接字返回数据为止的超时时间,其中包含的时间或大部分时间是服务器端处理业务逻辑的时间。
超时时间越长,任务接口的成功率越高,读取超时参数的配置越长。
HTTP请求一般需要得到结果,是同步调用。
超时时间长的话,在等待Server返回数据的同时,也在等待客户端线程(通常是Tomcat线程)。 如果下游服务发生大量超时,程序可能会被拖动以创建大量线程,最终导致崩溃。
在计划任务或异步任务中,读超时配置很长的问题不多。
但是,用户响应请求或面向微服务平台的同步接口调用通常同时量很多,因此必须设定短的读取超时时间,以免延迟到下游服务
如果将读取超时设置为2s,并且服务器端接口需要3s,可能会被问及执行结果永远得不到吗?
确实,要设定读取超时,根据实际情况如下。
太长的话下游的抖动可能会影响自己
太短可能会影响成功率。 此外,根据下游服务的SLA,每个服务器接口可能有不同的客户端读取超时。
1.4最佳做法
连接超时表示建立TCP连接的时间,读取超时表示等待远程数据回复的时间,也包括远程程序处理的时间。 要解决连接超时的问题,必须知道谁在连接。 如果遇到读取超时的问题,请综合考虑下游服务的服务标准和自己的服务标准,设定适当的读取超时时间。 此外,使用Spring Cloud Feign等框架时,请务必确认连接和读取超时参数的配置正确有效。
文/上海蓝盟 IT外包专家