无法限制 Jetty 服务器线程池最大大小的并发请求,为什么?



我创建了一个带有线程池的 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();
}
}

在上面的代码中,指定的线程池大小为 10。但同时我只能做 5 个。我尝试将大小更改为 20,但在这种情况下,我可以发出的并发请求总是少 5,即 15。知道这 5 个线程在哪里使用吗?

Jetty 不是那样工作的。

线程池不是那样工作的。

Jetty ThreadPool 用于任何需要线程的东西,而不仅仅是请求。

这包括:

  • 低级网络
  • 蔚来选择器
  • 网络接受器
  • HTTP 会话维护
  • 部署管理器行为
  • 使用凭据提供程序
  • 内部 HTTP 客户端行为
  • 已调度的内部请求
  • 异步处理行为
  • HTTP/2
  • 主连接处理(将协议泵送到每个 HTTP/2 会话/流(
  • OSGI 模块分辨率
  • 文件系统监控
  • 超时
  • 注释/字节码扫描
  • 代理行为
  • 等。。。

对ThreadPool的需求会根据您使用的功能(servlet,字节码扫描,代理,fastcgi等(,您使用的技术(例如:http/2,websocket,unixsockets等(而变化,甚至您的机器有多大(您的机器拥有的内核数量,NIO本身会根据机器拥有的内核数量的子集来构建线程(。

还有一个从任何提供的 ThreadPool 中取出的"保留线程"切片,用于处理对服务器上的操作至关重要的事情。 保留线程需求可能会在运行时发生变化(如上所述,这也取决于正在使用的技术(

如果要限制正在处理的请求数,请使用针对要限制的 url 模式配置的QoSFilter。(或者,如果您有稍微不同的要求,请使用DoSFilter(

  • https://www.eclipse.org/jetty/documentation/current/qos-filter.html
  • https://www.eclipse.org/jetty/documentation/current/dos-filter.html

不要通过ThreadPool来做,那永远不会奏效。

最新更新