Почему нельзя ограничить одновременный запрос максимальным размером пула потоков Jetty Server?

Я создал сервер Jetty с пулом потоков, чтобы ограничить количество одновременных запросов к серверу. Но размер, который я указываю, общий запрос, который я могу сделать, всегда на 5 меньше, чем размер, который я указал.

Зависимость:

<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-server</artifactId>
    <version>9.4.6.v20170531</version>
</dependency>

Код сервера:

public void httpServer(int port, Handler handler, String name) {
    QueuedThreadPool threadPool = new QueuedThreadPool(10);
    Server server = new Server(threadPool);
    server.setHandler(handler);
    HttpConfiguration http = new HttpConfiguration();

    ServerConnector serverConnector = new ServerConnector(server, new HttpConnectionFactory(http));
    serverConnector.setPort(port);
    server.setConnectors(new Connector[]{serverConnector});

    try {
        log.info(name + " Listener Started on port: " + port);
        server.start();
        server.join();
    } catch (Exception e) {
        log.error("Unable to start Server... Exiting");
        log.error(e, e);
        System.exit(1);
    }
}

Обработчик:

public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) {
    try {

        BufferedReader bufferedReader = request.getReader();
        String s;
        StringBuilder sb = new StringBuilder();
        PrintWriter writer = response.getWriter();
        while ((s = bufferedReader.readLine()) != null) {
            sb.append(s);
        }
        System.out.println("Got Request");
        Thread.sleep(2000);
        response.setStatus(HttpServletResponse.SC_OK);
        baseRequest.setHandled(true);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

В приведенном выше коде указанный размер ThreadPool равен 10. Но одновременно я могу сделать только 5. Я пытался изменить размер на 20, но в этом случае параллельный запрос, который я могу сделать, всегда на 5 меньше, т.е. 15. Любая идея, где эти 5 потоков используются?


person Saif Ahmad    schedule 10.10.2019    source источник


Ответы (1)


Пристань так не работает.

ThreadPools так не работает.

Jetty ThreadPool используется для всего, что требует потока, а не только для запросов.

Это включает :

  • сеть низкого уровня
  • нио селекторы
  • сетевые акцепторы
  • обслуживание http-сессии
  • поведение менеджера развертывания
  • работа с поставщиками учетных данных
  • поведение внутреннего HTTP-клиента
  • отправленные внутренние запросы
  • поведение асинхронной обработки
  • Обработка основного соединения http/2 (для загрузки протокола в каждую сессию/поток http/2)
  • разрешение модуля OSGI
  • мониторинг файловой системы
  • тайм-ауты
  • сканирование аннотаций/байткодов
  • поведение прокси
  • так далее...

Спрос на ваш ThreadPool меняется в зависимости от того, какие функции вы используете (сервлеты, сканирование байт-кода, прокси, fastcgi и т. д.), какую технологию вы используете (например, http/2, websocket, unixsockets и т. д.) и даже от размера вашей машины. (количество ядер вашей машины, nio сама потребует потоки на основе подмножества количества ядер вашей машины).

Существует также срез «Зарезервированные потоки», извлеченный из любого предоставленного ThreadPool для обработки вещей, которые имеют решающее значение для операций на сервере. Этот спрос на зарезервированные потоки может меняться во время выполнения (как указано выше, это также зависит от используемых технологий).

Если вы хотите ограничить количество активно обрабатываемых запросов, используйте QoSFilter, настроенный для шаблона URL, который вы хотите ограничить. (или используйте DoSFilter, если у вас немного другие требования)

Не делайте этого через ThreadPool, это никогда не сработает.

person Joakim Erdfelt    schedule 10.10.2019