Распараллеливание / потоки внутри веб-запроса в Scala / Java? - PullRequest
1 голос
/ 09 сентября 2011

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

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

1 Ответ

3 голосов
/ 09 сентября 2011

Я не понимаю, почему вы не можете использовать фьючерсы 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 для получения дополнительной информации: Akka 1.2R6 Будущая документация

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

...