使用thrift要小心超时

 

最近开始使用facebook的thrift。测试一个很简单的服务时,发现有时会出现请求和应答错位的情况。调了一段时间发现是因为thrift没有处理超时的问题。
例如我们写一个简单的EchoService:

service EchoService {
     string echo(1:string query),
}

thrift生成的代码是

public String echo(String query) throws TException
{
     send_echo(query);
     return recv_echo();
}

如果TSocket是保持连接的,正常的情况是

send_echo(A), recv_echo(A)
send_echo(B), recv_echo(B)

但如果在recv(A)的时候发生了超时,就变成下面的样子了

send_echo(A), timeout
send_echo(B), recv_echo(A)
send_echo(C), recv_echo(B)

后面的结果全都错位了。

解决的方法也很简单,一种是每次请求时都new一个TSocket(或者每次发现超时时new),另一种是在请求和应答里加入序号,在recv时发现序列不对就再次recv直到收到正确的。
另外thrift的代码在发送和接收时是带了序号的,但是序号一直都是0,在recv时也没有进行检查,不太清楚是什么原因。

另外,如果使用thrift自带的TThreadpoolServer, service的接口都是会被多线程调用的,所以server端实现接口时一定要保证线程安全

原文地址 http://prettymir.blog.163.com/blog/static/67405220200911682519514/

你可能感兴趣的:(Java)