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通过并行处理部分来提高性能可能是最好的