Socket Read Timeout 引发的问题

线上一个流式向hadoop集群写入数据的系统需要保证写入exactly once,并且不能丢失数据。为了解决这一问题,我们采用了thrift+write ahead log来构建这一系统。在使用过程中一直效果很好,最近偶然间发现这个服务发送了重复的日志。
经过检查发现,原来是是thrift tsocket read timeout导致的问题。我们的系统逻辑是client端向该系统发送日志,如果抛出异常,会将日志落到本地,等待一段时间后从本地读出日志继续发送。检查日志后发现在client端抛出

java.net.SocketTimeoutException: Read timed out

这就解释了写入重复的问题,首先client通过thrift TSokcet向server发送日志,如果超时了,client端timeout,抛出异常,将该条日志写入本地,过一段时间重现发送。而server端由于处理繁忙,没有及时响应client,虽然client中断连接,但是Server接收到该日志,并进行了处理。过一段时间后client端重新发送就产生了重复日志。
通过脚本检查这一问题的严重性,大概一条最多只有一条,目前将client端的超时时间增大解决这一问题。