2011-09-09 4 views
1

나는 (MongoDB의에) 데이터베이스 쿼리의 수를하고 다음 해당 데이터베이스 쿼리에 의해 반환 된 기록에 대한 처리의 적지 않은 금액을 수행하는 웹 서비스가 있습니다. 각 웹 요청은 이러한 요청 중 약 15-45 개를 실행해야하며 이는 각 쿼리 + 처리가 약 20ms가 걸릴 때 허용 할 수없는 페이지 응답 시간을 초래합니다. 캐쉬 미스 비율이 높고 데이터를 가능한 한 최신 상태로 유지해야하므로 캐싱이 작동하지 않습니다.스칼라/자바에서 웹 요청 내의 병렬 처리/스레드?

내가 실행하고 쿼리를 처리하는 클래스를 병렬화 스칼라 + Akka 배우를 사용하여 계획했다하지만 난 서블릿 컨테이너 내부 스레드를 생성 알고는 좋습니다. 스칼라에서 웹 요청 내에서 스레딩/병렬화를 수행하는 권장 방법은 무엇입니까? 이를 위해 Akka의 선물을 사용할 수없는 이유

+0

나는 당신의 질문에 대답하고 있지 않다. Akka Actors를 사용하는 것이 좋은 아이디어는 아닐 것이라고 말하고 싶습니다. Akka Futures는 여기 갈 길입니다. –

+0

@Derek 제 생각에는 Scala + Akka의 웹 요청 안에서 액터를 코드에 사용해도됩니까? 나는 하나 이상의 스레드를 갖고, 쿼리를 수행하는 클래스를 래핑하고 액터에서 처리하려고합니다. 나는 선물을 고려하고 있지만 배우도 사용할 수 있는지 알고 싶었습니다. –

+0

저는 Business Logic과 Web Container 사이에 Actor Shim을 배치하는 Akka의 HTTP 애드온 인 Mist를 사용하여 매우 안정적이고 확장 가능한 응용 프로그램을 성공적으로 작성했습니다. 그래서 나는 그것에 어떤 문제가 있는지 왜 보지 못합니다. –

답변

3

나는 (I은 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... 
    } 
} 

가 우수한 Akka 문서에서보세요 (그리고 당신의 요구에 맞게 Akka의 선물을 다루는 하나 이상의 방법은 확실히있다. 즉, 예를 들어 당신이 원하는에 적합하지 않을 수 있습니다) more info : Akka 1.2R6 Future documentation

앞서 언급 한 내용에서 나는 the Akka HTTP module을 사용하여 과거에 확장 성이 뛰어나고 신뢰할 수있는 앱을 제작했으며, 모두 Actor/Future 기반입니다. 두 개 이상의 스레드를 가질 수없는 경우, 당신이 무엇을 병렬화있어 아무 생각이 어떻게 때문에