私は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の仕様に従っていると仮定して何かを考慮する必要がありますか?どんな経験も大歓迎です。
私はApacheについて同じ質問がありますhttp://serverfault.com/questions/266184/does-apache-webserver-process-http-pipelined-requests-in-parallel –