Не удается ограничить число одновременных запросов максимальным размером пула потоков Jetty Server. Почему? - PullRequest
0 голосов
/ 10 октября 2019

Я создал сервер 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 потоков используются?

1 Ответ

1 голос
/ 10 октября 2019

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

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

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

Это включает в себя:

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

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

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

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

Не выполняйте это черезThreadPool, это никогда не будет работать.

...