2015-12-17 31 views
1

我在Tomcat 8上運行Spring MVC應用程序Elastic Beanstalkworker tier。對於那些不熟悉Elastic Beanstalk的用戶,無論何時發生SQS事件,亞馬遜都會自動執行POST請求給我的工作人員Spring MVC應用程序。然後,我的應用程序處理請求並返回200(除非明顯出現問題)。Tomcat on Elastic Beanstalk - Tomcat中的多線程線程

我想用併發同時處理單個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通過並行處理部分來提高性能可能是最佳選擇。