空闲时间后,Thrift客户端/服务器的响应时间不稳定



我编写了一个简单的Thrift客户端和服务器来测试服务。我正在使用我能找到的最简单的客户端…

TSocket socket = new TSocket(<host here>, 8002);
TProtocol proto = new TBinaryProtocol(socket);
Facade.Client client = new Facade.Client(proto);
socket.open();
...

…最简单的服务器…

Facade.Iface implementation = facadeContext.getBean(Facade.Iface.class);
Facade.Processor processor = new Facade.Processor(implementation);
TServerTransport transport = facadeContext.getBean(TServerSocket.class);  
final TServer thriftServer = new TSimpleServer(new Args(transport).processor(processor));
thriftServer.serve();
...

(同样,环境中的所有内容都是Thrift 0.6.1.)

当我用这个客户机处理几百个请求时,响应时间稳定在2毫秒左右,这在我的上下文中是可以接受的。但是,如果我继续发出请求,但是在它们之间放置一个轻微的延迟,比如5秒,这些时间会增加到4-6毫秒。

我已经尝试了Socket keep-alive属性和其他一些东西,但是有一些开销,我似乎无法量化。还有人看到这个吗?

我使用普通java.io.Socket编写了一个简单的TCP服务器,我认为我上面看到的与Thrift无关。我认为我观察到的轻微延迟与这样一个事实有关,即突发的请求缓冲了服务器上来自这些请求的输入,而间歇性请求则没有得到这种好处。具体来说,在下面的代码中…

public class SocketServerTest {
    public static void main(String[] args) throws Exception {
        try (ServerSocket serverSocket = new ServerSocket(8002)) {
            Socket socket = serverSocket.accept();
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String inputLine = null;
            while ((inputLine = in.readLine()) != null) {
                if (inputLine.equals("ping")) { out.println("pong"); }
            }
            out.close();
            in.close();
            socket.close();
        }
    }
}

…in.readLine()在请求数据被缓冲时不会阻塞。

现在,这并不能单独解释2毫秒的延迟,但是有几个地方发生了上述序列,所以它加起来。

最新更新