Spring Boot应用程序能同时处理多个请求吗?

45

我正在使用Spring Boot开发Rest API,并部署在AWS Beanstalk上。潜在地,该服务每天将会接收到数千个客户端的请求。因此,我希望了解Spring Boot处理多个请求的能力。

从我在Spring-Boot: Handle multiple requests concurrentlyHow to have thread safe controller in spring boot中所读到的内容来看,Spring Boot似乎可以同时处理多个请求,同时控制器也是线程安全的。

如果同时向同一个更新端点进行两个请求,那么控制器会逐一处理请求还是并行使用两个线程同时处理呢?如果是后者,每个线程是否都有自己的实体管理器?是否有一种方法可以实现线程池以限制线程数量,根据EC2实例的容量来决定启动多大的实例呢?顺便问一下,我如何根据预估请求量来确定要启动多大的实例呢?

3个回答

36

是的,Spring Boot可以同时处理多个请求!如果您的Servlet容器在幕后是Tomcat,则它可以处理200个同时请求。

下面的代码片段突出了这一点,但请参考原始的Spring Boot源代码

@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties {
  public static class Tomcat {
     public static class Threads {
       private int max = 200; // Maximum amount of worker threads
     }
  }
}

然而,您可以通过在application.propertiesapplication.yml中添加server.tomcat.threads.max来覆盖此值。

Spring将管理连接池并处理实体管理器的分配(根据您在属性中指定的最小和最大连接数)。 您可以在这里阅读更多信息:When are connections returned to the connection pool with Spring JPA (Hibernate) Entity Manager?


{btsdaf} - ddd
{btsdaf} - dunni
{btsdaf} - Felipe Mariano
server.tomcat.threads.max 的默认设置是什么? - shashwat
我使用了这个属性(server.tomcat.threads.max),也尝试了server.tomcat.max-threads,但我的嵌入式Tomcat仍然最多能同时处理200个线程,你能解决吗?谢谢。 - Diego Ramos
显示剩余2条评论

12
如果您正在使用Spring Boot开发Web应用程序(我的意思是您已将spring-boot-starter-web依赖项包含在pom文件中),Spring将自动嵌入Web容器(默认为Tomcat),并且它可以像常见的Web容器一样同时处理请求。
而且,您还可以通过修改依赖项将默认的Web容器从Tomcat更改为Undertow或Jetty。
正如@Felipe Mariano所说,您可以通过以下配置文件限制不同Web容器的最大工作线程数:
(1)对于Tomcat:server.tomcat.max-threads
(2)对于Undertow:server.undertow.worker-threads
(3)对于Jetty:server.jetty.acceptors

0

如果我没记错的话,每个请求都会创建一个Servlet容器,并由每个单独的新线程处理,因此从技术上讲,每个请求都是并行处理的。 您需要在应用程序属性文件中配置最大线程数。根据您的配置,线程池将由Spring框架处理。谢谢。


如果REST端点需要调用JNI函数,最好的处理方式是什么? - daparic

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