Java 弹性Beanstalk上的Tomcat-Tomcat线程中的多线程

Java 弹性Beanstalk上的Tomcat-Tomcat线程中的多线程,java,multithreading,spring,tomcat,amazon-elastic-beanstalk,Java,Multithreading,Spring,Tomcat,Amazon Elastic Beanstalk,我在Elastic Beanstalk的工作层上运行Spring MVC应用程序。对于那些不熟悉Elastic Beanstalk的人,每当发生SQS事件时,亚马逊将自动向我的员工Spring MVC应用程序执行POST请求。然后,我的应用程序处理请求并返回200(除非出现明显错误) 我希望在处理单个POST请求时使用并发。例如,假设我需要执行10种不同的昂贵计算。我希望使用ExecutorService让10个线程同时执行工作,而不是串行执行 这是坏习惯吗?如果不是,那么以这种方式旋转新线程

我在
Elastic Beanstalk
工作层上运行
Spring MVC
应用程序。对于那些不熟悉
Elastic Beanstalk
的人,每当发生SQS事件时,亚马逊将自动向我的员工
Spring MVC
应用程序执行
POST
请求。然后,我的应用程序处理请求并返回200(除非出现明显错误)

我希望在处理单个
POST
请求时使用并发。例如,假设我需要执行10种不同的昂贵计算。我希望使用
ExecutorService
让10个线程同时执行工作,而不是串行执行

  • 这是坏习惯吗?如果不是,那么以这种方式旋转新线程是否存在性能危险
  • 线程的分配实际上是如何工作的(例如,它们是从Tomcat的线程池中偷来的还是其他东西)
  • 是否应该有一个可供所有Tomcat线程访问的共享线程池?如果是,它应该有多大
  • 将工作分解成更多的SQS事件,并将子任务基本上分发给Tomcat线程,而不是在单个Tomcat线程中执行,这样做更好吗

这确实是多个问题,但归根结底是在使用Tomcat实现的队列工作程序中使用ExecutorService是否有意义

这种做法不好吗?如果没有,那么以这种方式启动新线程是否存在性能危险?

这很好,但你要确保你能做到

线程的分配实际上是如何工作的(例如,它们是从Tomcat的线程池中偷来的还是其他东西)?

ExecutorService将创建自己的线程池。Tomcat线程不能用于您自己的目的。拥有这个独立的游泳池没有什么错

是否应该有一个可供所有Tomcat线程访问的共享线程池?如果是,它应该有多大?

拥有一个跨所有Tomcat线程共享的池是有意义的。大小最好由您的特定用例决定,但是ExecutorService为您提供了许多选项来创建高效的池

将工作分解成更多的SQS事件,并将子任务基本上分发给Tomcat线程,而不是在单个Tomcat线程中执行,这样做更好吗?

这确实是一个重要的问题。如果您有不相关的独立任务,那么将它们分解为单独的SQS消息可能是有意义的。但是,如果您有单独的任务,这些任务实际上是更大任务的一部分,可以简单地并行执行,将其作为单个SQS消息保留,但使用ExecutorService通过并行处理部分来提高性能可能是最好的