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

Posted

技术标签:

【中文标题】Elastic Beanstalk 上的 Tomcat - Tomcat 线程中的多线程【英文标题】:Tomcat on Elastic Beanstalk - Multithreading within Tomcat thread 【发布时间】:2016-03-24 08:10:32 【问题描述】:

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

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

这是不好的做法吗?如果没有,以这种方式启动新线程是否存在性能危险? 线程分配实际上是如何工作的(例如,它们是从 Tomcat 的线程池中偷来的还是其他什么)? 是否应该有一个可供所有 Tomcat 线程访问的共享线程池?如果是这样,它应该有多大? 将工作分解为更多的 SQS 事件并实质上将子任务分配给 Tomcat 线程,而不是在单个 Tomcat 线程中执行是否更好?

【问题讨论】:

【参考方案1】:

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

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

这很好,但你要确保你configure Tomcat to properly shutdown the executor service。

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

ExecutorService 将创建自己的线程池。 Tomcat 线程不能用于您自己的目的。拥有这个单独的池没有任何问题。

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

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

将工作分解为更多的 SQS 事件并实质上将子任务分配给 Tomcat 线程,而不是在单个 Tomcat 线程中执行是否更好?

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

【讨论】:

以上是关于Elastic Beanstalk 上的 Tomcat - Tomcat 线程中的多线程的主要内容,如果未能解决你的问题,请参考以下文章

AWS Elastic Beanstalk 上的 Spring Boot 并记录到文件

Elastic Beanstalk 上的 SSL

如何避免 AWS Elastic Beanstalk 上的 TooManyApplicationVersion 异常?

如何避免 AWS Elastic Beanstalk 上的 TooManyApplicationVersion 异常?

无法连接到 Elastic Beanstalk 上的 ActionCable

AWS Elastic Beanstalk 上的 Wordpress