2011-09-09 25 views
1

我有一個web服務正在做一些數據庫查詢(到MongoDB),然後對這些數據庫查詢返回的記錄進行不平凡的處理。每個Web請求都需要運行大約15-45個請求,這會導致不可接受的頁面響應時間,因爲每個查詢+處理大約需要20ms。高速緩存將無法工作,因爲高速緩存未命中率會很高,數據需要儘可能新。Scala/Java中的Web請求中的並行化/線程?

我已經計劃使用Scala + Akka和actors來並行執行和處理查詢的類,但我知道在servlet容器內創建線程是不鼓勵的。在Scala的Web請求中進行線程化/並行化的推薦方式是什麼?

+0

我沒有回答你的問題,因爲如果你不能有多個線程,我不知道你如何平行化任何東西。我會說的是使用Akka Actor可能不是一個好主意。阿卡期貨將成爲這裏走的路。 –

+0

@Derek我認爲這是我的問題,可以在Scala + Akka的Web請求中的代碼中使用Actor嗎?我想要有多個線程,將查詢和處理的類封裝到Actor中。我正在考慮期貨,但也想知道我是否可以使用演員。 –

+0

我已經用Mist成功編寫了高度可靠和可伸縮的應用程序 - Akka中的HTTP附加程序,它將Actor調整器放在您的業務邏輯和Web容器之間。所以我不明白爲什麼它有任何問題。 –

回答

3

我不明白爲什麼你不能使用Akka的未來(我正在使用2.0 SNAPSHOT)。

import akka.dispatch.Future 
Future.sequence(1 to 45 map { i => 
    Future { 
    ... make database query i ... 
    } 
}) onComplete { future => 
    future.result.map { resultList => 
    // resultList.foldLeft... 
    // resultList.map... 
    // resultList.foreach... 
    // resultList.whatever... 
    } 
} 

(當然還有以應對阿卡期貨,以滿足您的需要不止一種方法。這個例子可能不是理想的你想要的)

看一看優秀阿卡文檔更多信息:Akka 1.2R6 Future documentation

正如我在上面的評論中提到的,我過去使用the Akka HTTP module來構建高度可擴展和可靠的應用程序,它們都是基於Actor/Future的。