Конвейерная обработка в Tomcat — параллельно?

Я пишу службу, используя TomCat, и пытаюсь понять функцию конвейерной обработки HTTP1.1 и ее реализацию в Tomcat.

Вот мои вопросы:

1] Конвейерная обработка в TomCat параллельно. i.e => После того, как он получит конвейерный запрос, он разбивает его на отдельные запросы и вызывает все это параллельно? Вот небольшой тест, который я сделал: судя по моим тестам, похоже, но я пытаюсь найти авторитетный документ и т. д.?

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");
    }

В приведенном выше тесте в test2 время отклика не [20 * 3 = 60+ мс]. Фактический запрос GET выполняется очень быстро. Это намекает на то, что они распараллеливаются, если я что-то не упустил?

2] Какова глубина конвейера по умолчанию в Tomcat? Как я могу это контролировать?

3] При разрешении конвейерной обработки на стороне сервера для моей службы нужно ли мне учитывать что-либо еще, предполагая, что клиент следует http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.1.4 при обработке конвейерной обработки? Любой опыт приветствуется.


person codeObserver    schedule 21.04.2011    source источник
comment
У меня тот же вопрос об Apache serverfault.com/questions/266184/   -  person Alexei Tenitski    schedule 05.05.2011


Ответы (2)


У меня был аналогичный вопрос о том, как работает Apache, и после нескольких тестов я могу подтвердить, что Apache действительно ожидает обработки каждого запроса, прежде чем начинать обработку следующего, поэтому обработка является ПОСЛЕДОВАТЕЛЬНОЙ.

person Alexei Tenitski    schedule 04.05.2011
comment
Из моих тестов кажется, что запросы обрабатываются tomcat параллельно. Вы говорите, что HTTP является последовательным или Apache Tomcat? - person codeObserver; 05.05.2011
comment
Я говорил об Apache (httpd), а не об Apache Tomcat. В этой статье также упоминается последовательная конвейерная обработка HTTP: http://www.igvita.com/2011/04/07/life-beyond-http-11-googles-spdy - person Alexei Tenitski; 06.05.2011

Концепция конвейерной обработки гласит, что мы должны иметь возможность принимать запросы в любой момент времени, но обработка запросов происходит в том порядке, в котором мы их получаем. то есть параллельная обработка не происходит

person Arvind Thatikonda    schedule 04.10.2011
comment
-1. Это заведомо неверно. RFC 2616 (см. ссылку OP) говорит, что сервер ДОЛЖЕН отправлять свои ответы на эти запросы в том же порядке, в котором запросы были получены. Это никоим образом не мешает серверу обрабатывать все запросы параллельно. Это можно сделать совершенно бесплатно, используя несколько потоков. Единственное требование состоит в том, чтобы он возвращал ответы в том порядке, в котором были получены запросы. Если сетевая задержка низкая, но задержка обработки высокая, то параллельная обработка запросов может значительно сократить общую задержку. - person npgall; 08.10.2015