我正在 Elastic Beanstalk
的 worker tier
上的 Tomcat 8
上运行 Spring MVC
应用程序。对于那些不熟悉 Elastic Beanstalk
的人,只要发生 SQS 事件,Amazon 就会自动向我的工作程序 Spring MVC
应用程序执行一个POST
请求。然后我的应用程序处理请求并返回 200(除非出现明显的错误)。
我想在处理单个 POST
请求时使用并发。例如,假设我需要执行 10 种不同的昂贵计算。我不想按顺序执行,而是想使用 ExecutorService
让 10 个线程同时执行工作。
- 这是不好的做法吗?如果不是,以这种方式启动新线程是否存在性能危险?
- 线程的分配实际上是如何工作的(例如,它们是从 Tomcat 的线程池中窃取的还是其他什么东西)?
- 是否应该有一个可供所有 Tomcat 线程访问的共享线程池?如果是这样,它应该有多大?
- 将工作分解为更多 SQS 事件并将子任务分配给 Tomcat 线程,而不是在单个 Tomcat 线程中完成是否更好?
最佳答案
这确实是多个问题,但根本问题是在使用 Tomcat 实现的队列工作线程内部使用 ExecutorService 是否有意义。
这是不好的做法吗?如果不是,以这种方式启动新线程是否存在性能危险?
这很好,但您需要确保自己 configure Tomcat to properly shutdown the executor service .
线程的分配实际上是如何工作的(例如,它们是从 Tomcat 的线程池中窃取的还是其他什么东西)?
ExecutorService 将创建自己的线程池。 Tomcat 线程不能用于您自己的目的。拥有这个单独的池没有错。
是否应该有一个可供所有 Tomcat 线程访问的共享线程池?如果是这样,它应该有多大?
拥有一个可以在所有 Tomcat 线程之间共享的池是有意义的。大小最好由您的特定用例决定,但 ExecutorService 为您提供了多种选项来创建高效的池。
将工作分解为更多 SQS 事件并将子任务分配给 Tomcat 线程,而不是在单个 Tomcat 线程中完成是否更好?
这确实是一个重要的问题。如果您有不相关的独立任务,将它们分解为单独的 SQS 消息可能是有意义的。但是,如果您有单独的任务,这些任务实际上是可以简单地并行执行的更大任务的一部分,则将其保留为单个 SQS 消息,但使用 ExecutorService 通过并行处理部分来提高性能可能是最好的。
关于java - Elastic Beanstalk 上的 Tomcat - Tomcat 线程内的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34341691/