2016-05-03 18 views
0

私はJettyとVertX.3のベンチマークテストを非同期サポートしています。以下は私のVertXのサンプルコードです。VertX vs Jettyパフォーマンスの問題

public class VertXSampleServer extends AbstractVerticle{ 
    @Override 
    public void start(){ 
     HttpServer server=vertx.createHttpServer(); 
     server.requestHandler(new Handler<HttpServerRequest>() { 

    @Override 
    public void handle(HttpServerRequest request) { 
     HttpServerResponse response=request.response(); 
     response.setStatusCode(HttpStatus.SC_OK); 
     System.out.println("re received"); 
     response.putHeader("Content-Length", Integer.toString(5)); 
     response.write("Hello"); 
    } 
    }).listen(9091); 
    } 
} 

桟橋サンプルサーバ:

public class JettySampleAsyncServer 
{ 
public static class EmbeddedAsyncServlet extends HttpServlet 
{ 
@Override 
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
{ 
final AsyncContext ctxt = req.startAsync(); 

ctxt.start(new Runnable() 
{ 
@Override 
public void run() 
{ 
System.out.println("In AsyncContext/Start/Runnable/run"); 
ServletResponse response=ctxt.getResponse(); 
byte[] result="<h1>Hello World</h1>".getBytes(); 
try { 
response.setContentType("text/html"); 
response.setCharacterEncoding("UTF-8"); 
response.setContentLength(result.length); 
response.getOutputStream().write(result); 

} catch (IOException e) { 
e.printStackTrace(); 
} 
ctxt.setTimeout(new Long(1000)); 
ctxt.complete(); 
} 
}); 
} 
} 
public static void main(String[] args) throws Exception 
{ 
Server server = new Server(); 
QueuedThreadPool queuedThreadPool=(QueuedThreadPool) server.getThreadPool(); 
queuedThreadPool.setMaxThreads(8); 
ServerConnector serverConnector=new ServerConnector(server,1,4); 
serverConnector.setHost("localhost"); 
serverConnector.setPort(9090); 
// serverConnector.setAcceptQueueSize(100); 
server.addConnector(serverConnector); 
ServletContextHandler context = new ServletContextHandler(); 
context.setContextPath("/"); 
ServletHolder asyncHolder = context.addServlet(EmbeddedAsyncServlet.class,"/*"); 
asyncHolder.setAsyncSupported(true); 
server.setHandler(context); 
server.start(); 
server.join(); 
} 
} 

VERTXをテストしながら、私は31件のリクエスト/分のスループットを取得しています。しかしテスト桟橋ながら、私は310 REQ /秒を取得しています。 誰も私にexaplinパフォーマンスのこの非常に高いギャップの理由を教えてください。また、私はベンチマークテストにApache Jmeterを使用しています。

+0

パフォーマンスが重要な場合は、永続的な接続を持つWebソケットを使用することをお勧めします。 1回の接続で最大30,000リクエスト/秒を得ることができます。より低いレベルのプロトコルを使用する場合、1秒あたり数100,000/msgを達成することができます。 –

+0

私たちは設計の初期段階で、jettyかVertXのどちらを選択するかを決めなければなりません。サンプルの実装でベンチマークテストを行っています。私が何かを見逃してしまった場合は教えてください –

+0

Jettyを使用している30,000 msg /秒。私はあなたがテストしている方法が問題だと思っています。例えば接続を作成して削除すると、これはサーバーの作業と同じくらい高価になります。 –

答えて

1

Vert.xの実装にはいくつかの問題があります。たとえば、接続が終了していないと、タイムアウトが発生して完了することがあります。

public class VertXSampleServer extends AbstractVerticle { 
    @Override 
    public void start() { 
    HttpServer server=vertx.createHttpServer(); 
    server.requestHandler(new Handler<HttpServerRequest>() { 
     @Override 
     public void handle(HttpServerRequest request) { 
     HttpServerResponse response=request.response(); 
     // by default it is 200 so this is optional 
     response.setStatusCode(HttpStatus.SC_OK); 
     System.out.println("re received"); 
     response.putHeader("Content-Length", Integer.toString(5)); 
     // what you're doing here is wrong you should end the response 
     // response.write("Hello"); 
     response.end("Hello"); 
     // You should use write if you are going to use chunked responses 
     // and the last one should be a end to notify that the request 
     // is finished 
     } 
    }).listen(9091); 
    } 
} 

http応答を処理する方法に関する完全なドキュメントはhereです。

チャンク書き込み(あなたがしたこと)と応答の終了の違いについて説明します。

+1

ありがとう...タイムアウトが表示されず、パフォーマンスも改善されています。 –

関連する問題