当“SDK接收到数据的时间”减去“SDK发送数据的时间”超过SocketTimeout时,SDK会抛出SocketTimeoutException。这段时间内包含了“应用发送请求(包含网络传输)”、“服务端处理”和“应用接收响应(包含网络传输)”。SocketTimeout可以在创建OTSClient时自定义,如果没有设置,默认是15s。
出现SocketTimeoutException,可能是以下几种原因:
网络不通
如果全部请求都是SocketTimeoutException,那么首先可能是网络不通,可以通过ping或者curl命令测试是否为网络问题:
ping aaaa.cn-hangzhou.ots.aliyuncs.com
curl aaaa.cn-hangzhou.ots.aliyuncs.com
正常情况下,curl会返回类似下面的结果:
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>OTSUnsupportOperation</Code><Message>Unsupported operation: ''.</Message><RequestID>00054ec5-822c-8964-adaf-990a07a4d0c9</RequestID><HostID>MTAuMTUzLjE3NS4xNzM=</HostID></Error>
如果发现是网络不通,可能是在非ECS环境使用了内网的endpoint。
服务端处理慢,超过了SDK设置的SocketTimeout值
一个请求在表格存储服务端的处理时间几乎是不会超过15秒的,因为服务端也会有一个超时时间,大概是10秒,超过这个时间会给客户端返回OTSTimeout错误。
但是,假设在SDK端自定义了SocketTimeout,例如2秒,那么当服务端执行时间超过2秒时,SDK就会抛出SocketTimeoutException错误。
网络传输慢
如果服务端处理时间并不长,但是网络传输慢,导致整体延迟长,也会导致SocketTimeoutException。检查是否存在流量过高、带宽吃紧、网络重传率高等情况。
Java进程的GC频繁,经常FullGC,导致SocketTimeoutException
这种情况也会经常遇到,程序负载高,GC频繁时出现SocketTimeoutException。原因是当发生FullGC的时候,请求发不出去,或者收不到响应,超过了SDK端设置的SocketTimeout,就会抛出SocketTimeoutException。
这种情况下需要用工具分析进程的GC情况,解决进程频繁GC的问题。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。