【问题标题】:Can Spring Boot application handle multiple requests simultaneously?Spring Boot 应用程序可以同时处理多个请求吗?
【发布时间】:2018-04-04 05:31:57
【问题描述】:

我正在使用部署在 AWS Beanstalk 上的 Spring Boot 开发 Rest API。有可能,该服务每天都会受到成千上万客户的欢迎。因此,我想了解 Spring Boot 处理多个请求的能力。

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

如果同时向同一个端点发出两个更新请求,控制器是一个接一个地处理这些请求,还是同时并行处理两个线程?如果是后者,每个线程是否都有自己的实体管理器?有没有办法实现一个线程池来根据EC2实例的容量来限制线程的数量?顺便问一下,我如何根据估计的请求量来决定我应该从多大的实例开始?

【问题讨论】:

    标签: multithreading rest spring-boot spring-data-jpa amazon-elastic-beanstalk


    【解决方案1】:

    是的,Spring boot 可以同时处理请求! 如果您的 servlet 容器在底层是 tomcat,它可以同时处理 200 个请求。

    sn-p下面重点突出,但参考original spring boot source

    @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
         }
      }
    }
    

    但是,您可以通过将server.tomcat.threads.max 添加到您的application.propertiesapplication.yml 来覆盖此值。

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

    【讨论】:

    • 我将应用程序部署为不使用嵌入式 tomcat 的战争。这个server.tomcat.max-threads 还能用吗?
    • 没有。然后你必须单独配置你的servlet容器。
    • 哦,在这种情况下,最大线程数不起作用,但您可以更改 Elastic Beanstalk 中的并发连接数!只需输入您的 Worker,转到 Configuration > Worker Configuration 并更改 HTTP Connections 字段。
    • @FelipeMariano 似乎找不到worker Configuration 的位置。是在我定义 SERVER_PORT 和其他环境变量的 Beanstalk 控制台中吗?
    • 哦!这里我使用了一些 Worker 的环境,我可以在 Worker Configuration 部分编辑连接数(这里我在 Software Configuration 部分定义环境变量)。
    【解决方案2】:

    如果你正在使用 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) 码头:server.jetty.acceptors

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 如果 REST 端点需要调用 JNI 函数,最好的处理方法是什么?
      猜你喜欢
      • 2018-02-23
      • 2019-08-01
      • 2023-03-27
      • 2013-03-27
      • 1970-01-01
      • 2018-02-28
      • 2020-06-05
      • 2019-06-20
      相关资源
      最近更新 更多