2011-04-21 4 views
4

私はTomCatを使用してサービスを作成しており、HTTP1.1のパイプライン機能とその実装をTomcatで理解しようとしています。ここでTomcatでのパイプライン - 並列?

は私の質問は以下のとおりです。

1] Tomcatの並列にパイプライン化されています。すなわち、>パイプライン化された要求を受け取った後、それを個々の要求に分解し、すべての要求を並列に呼び出しますか? 私は小さなテストをしました:私のテストから、それは見えますが、私は権限のある文書などを見つけようとしていますか?

public static void main(String[] args) throws IOException, InterruptedException 
    { 
     Socket socket = new Socket(); 
     socket.connect(new InetSocketAddress("ServerHost", 2080)); 
     int bufferSize = 166; 
     byte[] reply = new byte[bufferSize]; 
     DataInputStream dis = null; 

     //first without pipeline - TEST1 
//  socket.getOutputStream().write(
//   ("GET URI HTTP/1.1\r\n" + 
//   "Host: ServerHost:2080\r\n" + 
//   "\r\n").getBytes()); 
//  
//  final long before = System.currentTimeMillis(); 
//  dis = new DataInputStream(socket.getInputStream()); 
//  Thread.currentThread().sleep(20); 
//  final long after = System.currentTimeMillis(); 
//  
//  dis.readFully(reply); 
//  System.out.println(new String(reply));   

     //now pipeline 3 Requests - TEST2 
     byte[] request = ("GET URI HTTP/1.1\r\n" + 
      "Host:ServerHost:2080\r\n" + 
      "\r\n"+ 
      "GET URI HTTP/1.1\r\n" + 
      "Host: ServerHost:2080\r\n" + 
      "\r\n"+ 
      "GET URI HTTP/1.1\r\n" + 
      "Host: ServerHost:2080\r\n" + 
      "\r\n").getBytes(); 
     socket.getOutputStream().write(request); 
     bufferSize = 1000*1; 
     reply = new byte[bufferSize]; 

     final long before = System.currentTimeMillis(); 
     dis = new DataInputStream(socket.getInputStream()); 
     Thread.currentThread().sleep(20); 
     final long after = System.currentTimeMillis(); 

     dis.readFully(reply); 
     System.out.println(new String(reply)); 

     long time = after-before; 
     System.out.println("Request took :"+ time +"milli secs"); 
    } 

上記のテストでは、テスト2では応答時間は[20 * 3 = 60 + ms]ではありません。実際のGETリクエストは非常に高速です。これは、私が何かを見逃していない限り、これらが並列化されていることを示唆していますか?

2] Tomcatのデフォルトのパイプライン深度はどのくらいですか?どうすればそれを制御できますか?

3]私のサービスのためにサーバー側でパイプラインを許可する場合、パイプライニングを処理するときにクライアントがhttp://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.1.4の仕様に従っていると仮定して何かを考慮する必要がありますか?どんな経験も大歓迎です。

+0

私はApacheについて同じ質問がありますhttp://serverfault.com/questions/266184/does-apache-webserver-process-http-pipelined-requests-in-parallel –

答えて

1

私は、パイプラインの概念SEQUENTIAL

+0

私からテストでは、リクエストはTomcatによって並行して処理されるようです。あなたは、HTTPは、順次またはApache Tomcatですか? – codeObserver

+0

私はApache TomcatではなくApache(httpd)について話していました。 HTTPパイプライニングが順調に進んでいることは、この記事でも述べています。http://www.igvita.com/2011/04/07/life-beyond-http-11-googles-spdy –

1

でどのようにApacheの作品や、いくつかのテストを行った後、私はApacheがないことを確認してInfactは各リクエストが処理して、次のいずれかの処理を開始する前に処理されるのを待つことができますについて同様の質問がありました私たちはいつでも要求を受け入れることができなければならないと言いますが、要求の処理は取得した順序で行われます。それは並列処理が行われていません

+0

-1。それは間違いだ。 RFC 2616(OPのリンクを参照)は、「要求が受信されたのと同じ順序で、要求に応答を送信しなければならない」と述べています。これにより、サーバーがすべての要求を並行して処理することは決してありません。これは、複数のスレッドを使用して完全に自由です。唯一の要件は、要求が受信された順序で応答を返すことです。ネットワークレイテンシは低いが処理レイテンシが高い場合は、要求を並行して処理することで全体的なレイテンシを大幅に減らすことができます。 – npgall

関連する問題