2011-09-09 1 views
1

У меня есть веб-сервис, который выполняет ряд запросов к базе данных (в MongoDB), а затем выполняет нетривиальное количество обработки записей, возвращаемых этими запросами базы данных. Каждый веб-запрос должен запускать около 15-45 из этих запросов, что вызывает неприемлемое время отклика страницы, так как каждый запрос + обработка занимает около 20 мс. Кэширование не будет работать, так как скорость кэширования будет высокой, и данные должны быть как можно более свежими.Параллелизация/потоки внутри веб-запроса в Scala/Java?

Я планировал использовать Scala + Akka и актеров для распараллеливания класса, выполняющего и обрабатывающего запросы, но я знаю, что создание потоков внутри контейнера сервлетов не рекомендуется. Каков рекомендуемый способ выполнения потоковой обработки/распараллеливания внутри веб-запроса в Scala?

+0

Я не отвечаю на ваш вопрос, потому что, если у вас не может быть более одного потока, я понятия не имею, как вы распараллеливаете что-либо. Я бы сказал, что использование Аккой Актеров, вероятно, не будет отличной идеей. Akka Futures - это путь сюда. –

+0

@Derek Я думаю, что это мой вопрос, можно ли использовать Актеры в моем коде внутри веб-запроса в Scala + Akka? Я хочу иметь более одного потока, обертывая класс, который выполняет запрос и обработку в Актере. Я рассматриваю Futures, но также хотел узнать, могу ли я использовать Актеры. –

+0

Я успешно написал высоконадежные и масштабируемые приложения с Mist - надстройкой HTTP в Akka, которая ставит актерскую прокладку между вашей бизнес-логикой и веб-контейнером. Поэтому я не понимаю, почему с этим возникли проблемы. –

ответ

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 документации Дополнительная информация: Akka 1.2R6 Future documentation

Как я уже упоминал в приведенных выше замечаниях, я использовал the Akka HTTP module для создания высокомасштабируемых и надежных приложений в прошлом, и все они основаны на Actor/Future.

Смежные вопросы