簡體   English   中英

無法使用 Jetty 服務器線程池最大大小限制並發請求,為什么?

[英]Cannot limit concurrent request with Jetty Server Thread Pool max size, why?

我創建了一個帶有線程池的 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 個線程正在使用嗎?

碼頭不是那樣工作的。

ThreadPools 不是那樣工作的。

Jetty ThreadPool 用於任何需要線程的事情,而不僅僅是請求。

那包含着:

  • 低級網絡
  • nio 選擇器
  • 網絡接受者
  • http session維修
  • 部署管理器行為
  • 與憑證提供者合作
  • 內部 http 客戶端行為
  • 發送的內部請求
  • 異步處理行為
  • http/2 主連接處理(將協議泵入每個 http/2 會話/流)
  • osgi模塊解析
  • 文件系統監控
  • 超時
  • 注釋/字節碼掃描
  • 代理行為
  • ETC...

對 ThreadPool 的需求會根據您使用的功能(servlet、字節碼掃描、代理、fastcgi 等)、使用的技術(例如:http/2、websocket、unixsockets 等)甚至您的機器有多大而變化(您的機器擁有的核心數量,nio 本身將需要基於您機器擁有的核心數量的子集的線程)。

還有一個“保留線程”切片從任何提供的 ThreadPool 中取出來處理對服務器上的操作至關重要的事情。 保留線程的需求可能會在運行時發生變化(如上,它還取決於使用的技術)

如果要限制正在處理的主動請求的數量,請使用針對要限制的 url 模式配置的QoSFilter (或者如果您的要求略有不同,請使用DoSFilter

不要通過 ThreadPool 來做,那永遠不會起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM