阿里云数据库表格存储(TableStore) 高级开发工程师
表格存储JavaSDK使用的是slf4j的日志接口和log4j2的日志接口实现。
slf4j是通用的Java日志接口,可以对接不同的日志库实现,因此也就可以将SDK依赖的log4j2排除,换用其他的日志库。
假设应用使用的日志库为log4j (注意,log4j与log4j2不同),可通过以下方法排除SDK依赖的日志库,引入slf4j-log4j的库,使得应用的业务代码和SDK都采用log4j打印日志。
排除SDK依赖的log4j2日志库实现:
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>tablestore</artifactId>
<version>4.3.1</version>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
</exclusion>
</exclusions>
</dependency>
引入slf4j-log4j12
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>
当“SDK接收到数据的时间”减去“SDK发送数据的时间”超过SocketTimeout时,SDK会抛出SocketTimeoutException,这段时间内包含了“应用发送请求(包含网络传输)”、“服务端处理”、“应用接收响应(包含网络传输)”。SocketTimeout可以在创建OTSClient的时候自定义,如果没有设置,目前默认是15s。
_
如果全部请求都是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。
一个请求在表格存储服务端的处理时间几乎是不会超过15秒的,因为服务端也会有一个超时时间,大概是10秒,超过这个时间会给客户端返回OTSTimeout错误。
但是假设在SDK端自定义了SocketTimeout,比如2秒,那么当服务端执行时间超过2秒时,SDK就会抛出SocketTimeoutException错误。
如果服务端处理时间并不长,但是网络传输慢,导致整体延迟长,也会导致SocketTimeoutException,这种情况要看下是否流量过高,带宽吃紧,网络重传率高等。
这种情况也会经常遇到,程序负载高,GC频繁时出现SocketTimeoutException。
原因是当发生FullGC的时候,请求发不出去,或者收不到响应,超过了SDK端设置的SocketTimeout,就会抛出SocketTimeoutException。
这种情况下需要用工具分析进程的GC情况,解决进程频繁GC的问题。
如果出现HttpClient冲突时,可以把HttpClient相关的库也加到exclusion里,配置如下:
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>ots-public</artifactId>
<version>2.2.4</version>
<classifier>jar-with-dependencies</classifier>
<exclusions>
<exclusion>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpasyncclient</artifactId>
</exclusion>
</exclusions>
</dependency>