Spring Boot是否创建N个线程来处理N个API请求?

3

我正在使用Spring Boot 2.5编写HTTP API服务器。关于Spring Boot如何处理多个HTTP请求,我有些困惑。

假设Spring Boot应用程序同时处理N个请求。它是否会为Spring Boot应用程序创建N个线程?


类似于https://dev59.com/w1YN5IYBdhLWcg3wzKzf - Sarfraz Shaikh
1个回答

4
Spring Boot会创建N个线程来处理N个请求,但这不是Spring Boot的特点,对于基于Web Container的应用程序,你真的不需要担心自己管理线程(虽然了解内部情况很好)。Spring Boot基于Servlet API进行HTTP通信,即Spring Boot使用Servlet容器(在后台作为应用服务器运行)处理HTTP通信并通常提供HTTP服务Spring Boot使用Tomcat作为默认的Servlet容器。另一方面,Servlet API定义了HttpServletRequest和HttpServletResponse类型,以便轻松处理HTTP请求和HTTP响应消息。现在问题变成了:Servlet容器如何处理HTTP请求?

Java™ Servlet规范

  • 2.1 请求处理方法
    • 通常,Web容器通过在不同线程上并发执行服务方法来处理对同一servlet的并发请求;
    • (重要的是)处理对Web应用程序的并发请求通常需要Web开发人员设计能够处理在特定时间内在服务方法中执行的多个线程的servlet。

此外,请注意service()方法文档中所述

Servlet通常在可以同时处理多个请求的多线程servlet容器中运行。开发人员必须注意同步访问任何共享资源,如文件、网络连接以及servlet的类和实例变量。

故事看起来是这样的:

  1. 当容器发现一个HTTP请求消息被映射到Servlet实例时,它会实例化两个对象:HttpServletResponseHttpServletRequest(每个请求都会这样);
  2. 然后,容器为该请求创建(或从线程池中分配)一个新线程,并通过将这些HttpServletRequest和HttpServletResponse对象传递到该方法中,调用Servlet的service(..)方法。

如果不是这样设计的话,服务器会在每个HTTP消息中阻塞执行,直到后者完成。

请注意:

与请求关联的线程可能处于空闲状态的两种常见情况:

  1. 线程需要等待资源可用或处理数据以便构建响应。例如,应用程序可能需要查询数据库或访问远程Web服务才能生成响应;
  2. 线程需要等待事件以便生成响应。例如,应用程序可能需要等待JMS消息、其他客户端的新信息或队列中的新数据才能生成响应。

1
Servlet容器不会创建新线程,它使用一个默认有200个线程的线程池来处理请求。如果有201个并发请求,最后一个请求将失败或被放入队列以供稍后处理。 - M. Deinum
只是编辑问题,使其更精确;但是,如果池已用尽,如果我没有弄错的话,将实例化更大/更新的池..否则200个并发请求可能会锁定应用程序。 - Giorgi Tsiklauri
这取决于策略,甚至创建更多的线程可能会使应用程序挂起。 - M. Deinum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接