2011-09-09 12 views
1

(MongoDBに対して)多数のデータベースクエリを実行しているWebサービスがあり、それらのデータベースクエリによって返されたレコードに対して処理のしかたがほとんどありません。各Web要求は、約15〜45回のこれらの要求を実行する必要があり、各問合せ+処理に約20msかかるため、許容できないページ応答時間が発生します。キャッシュミス率が高く、データをできるだけ新鮮にする必要があるため、キャッシュは機能しません。Scala/JavaのWebリクエスト内の並列化/スレッド?

Scala + Akkaとアクターを使ってクエリを実行して処理するクラスを並列化する予定でしたが、サーブレットコンテナ内にスレッドを作成することはお勧めできません。 ScalaでのWebリクエスト内でのスレッド/並列化の推奨方法は何ですか?

+0

複数のスレッドを持つことができない場合は、どのように並列化しているのかわからないため、私はあなたの質問に答えません。私が言うことは、Akka Actorsを使うことはおそらく素晴らしい考えではないということです。 Akka Futuresはここに行く道だ。 –

+0

@Derek私はScala + AkkaのWebリクエストの中で自分のコードにActorsを使用することはできますか?私は、複数のスレッドを持ち、クエリを実行するクラスをラップし、アクタで処理したいと考えています。私は先物を考えているだけでなく、私が俳優を使うことができるかどうかを知りたがっています。 –

+0

私は、ビジネスロジックとWebコンテナの間にActorシムを配置する、AkkaのHTTPアドオンであるMistを使用して、信頼性の高いスケーラブルなアプリケーションを作成しました。だから私はそれに何か問題があるのか​​分からない。 –

答えて

3

なぜ私はこのためにAkkaのFuturesを使用できないのか分かりません(私は2.0スナップショットを使用しています)。

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... 
    } 
} 

がための優れたアッカのドキュメントを見てください(そして、あなたのニーズに合うようにアッカで先物に対処するための複数の方法は確かにあります。その例は、あなたが望むもののために理想的ではないかもしれません) more info: Akka 1.2R6 Future documentation

私が上記のコメントで述べたように、私はthe Akka HTTP moduleを使用して、スケーラビリティと信頼性の高いアプリを過去に構築しました。それらはすべてActor/Futureベースです。

関連する問題