问题描述
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)
问题原因
访问公网的超时时间设置太短。
解决方案
- 查看SocketTimeoutException错误日志,确认没有返回任何Request ID ,说明不是API的相关限制或者语法错误等原因,应该是纯粹的网络超时。
- 通过客户端抓取一段时间交互的网络报文,通过统计功能确认状态异常,总共请求了29次数据,但是只有26次返回结果,如下图所示。
- 追踪问题流,确认API超过1秒钟没有返回数据,客户端应该认为调用API超时,于是主动发起断开连接。
- 访问公网1秒的超时时间太短,TCP的保护机制必须需要超过1秒以上的时间,建议客户端超时时间加长,加长超时时间之后后此问题不再出现。
适用于
- 负载均衡SLB
文档内容是否对您有帮助?