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

标签 java multithreading spring tomcat amazon-elastic-beanstalk

我正在 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 是否有意义。

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

这很好,但您需要确保自己 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/

相关文章:

python - 同时运行两个接受参数和返回列表的函数?

spring - java spring session如何自定义cookie键

java - 接口(interface)实现错误 : cannot find symbol

java - 当可滚动的 recyclerView 仅占手机屏幕的一半时,如何让 Activity 中的整个屏幕滚动

java - Netbeans IDE - 指定的 jdkhome 无效

c# - 在一个线程中锁定,在另一个线程中释放

java - Eclipse Java 调试器在一个文件中始终偏离应有的位置 6 行

android - Android注解中Main Thread、Ui Thread、WorkerThread、Binder Thread的区别

spring - 开发中的代理前端HTTP调用

java - 我如何从 Hibernate 的第三张表中获取属性?