繁体   English   中英

Elastic Beanstalk上的Tomcat-Tomcat线程内的多线程

[英]Tomcat on Elastic Beanstalk - Multithreading within Tomcat thread

我正在Elastic Beanstalkworker tier上的Tomcat 8上运行Spring MVC应用程序。 对于不熟悉Elastic Beanstalk ,每当发生SQS事件时,Amazon都会自动向我的辅助Spring MVC应用程序执行POST请求。 然后,我的应用程序处理该请求并返回200(除非出现明显问题)。

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

  • 这是不好的做法吗? 如果没有,以这种方式扩展新线程是否存在性能危险?
  • 线程的分配实际上是如何工作的(例如,它们是刚从Tomcat的线程池或其他线程中窃取的)?
  • 是否应该有一个可由所有Tomcat线程访问的共享线程池? 如果是这样,应该多大?
  • 将工作分解为更多的SQS事件并本质上将子任务分配给Tomcat线程,而不是在单个Tomcat线程中完成,这会更好吗?

这确实是多个问题,但从根本上讲,在使用Tomcat实现的队列工作器中使用ExecutorService是否有意义。

这是不好的做法吗? 如果没有,以这种方式扩展新线程是否存在性能危险?

很好,但是您需要确保配置Tomcat来正确关闭executor服务

线程的分配实际上是如何工作的(例如,它们是刚从Tomcat的线程池或其他线程中窃取的)?

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

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

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

将工作分解为更多的SQS事件并本质上将子任务分配给Tomcat线程,而不是在单个Tomcat线程中完成,这会更好吗?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM