SLB服务调用API网关超时的问题分析与处理步骤

问题描述

SLB服务调用API网关进行虚拟服务器组负载调整时进程异常,报如下错误。
cause by (ClientException): SDK.ServerUnreachable : SocketTimeoutException has occurred on a socket read or accept.
         at com.aliyuncs.DefaultAcsClient.doAction(DefaultAcsClient.java:199)
         at com.aliyuncs.DefaultAcsClient.doAction(DefaultAcsClient.java:151)
         at com.aliyuncs.DefaultAcsClient.doAction(DefaultAcsClient.java:59)
         at com.aliyuncs.DefaultAcsClient.getAcsResponse(DefaultAcsClient.java:103) 

问题原因

访问公网的超时时间设置太短。

解决方案

  1. 查看SocketTimeoutException错误日志,确认没有返回任何Request ID ,说明不是API的相关限制或者语法错误等原因,应该是纯粹的网络超时。
  2. 通过客户端抓取一段时间交互的网络报文,通过统计功能确认状态异常,总共请求了29次数据,但是只有26次返回结果,如下图所示。
  3. 追踪问题流,确认API超过1秒钟没有返回数据,客户端应该认为调用API超时,于是主动发起断开连接。
  4. 访问公网1秒的超时时间太短,TCP的保护机制必须需要超过1秒以上的时间,建议客户端超时时间加长,加长超时时间之后后此问题不再出现。

适用于

  • 负载均衡SLB