Question

J'ai un service Web qui effectue un certain nombre de requêtes de base de données (vers MongoDB), puis qui effectue un traitement non négligeable sur les enregistrements renvoyés par ces requêtes de base de données.Chaque requête Web doit exécuter environ 15 à 45 de ces requêtes, ce qui entraîne des temps de réponse de page inacceptables, car chaque requête + traitement prend environ 20 ms.La mise en cache ne fonctionnera pas car le taux de manque de cache sera élevé et les données doivent être aussi fraîches que possible.

J'avais prévu d'utiliser Scala + Akka et des acteurs pour paralléliser la classe exécutant et traitant les requêtes mais je sais que la création de threads à l'intérieur d'un conteneur de servlet est déconseillée.Quelle est la méthode recommandée pour effectuer un threading / parallélisation dans une requête Web dans Scala?

Était-ce utile?

La solution

Je ne vois pas pourquoi vous ne pouvez pas utiliser les Futures d'Akka pour cela (j'utilise l'INSTANTANÉ 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...
  }
}

(Et il y a certainement plus d'une façon de gérer les contrats à terme dans Akka en fonction de vos besoins. Cet exemple n'est peut-être pas idéal pour ce que vous voulez)

Consultez l'excellente documentation d'Akka pour plus d'informations: Akka 1.2Documentation future R6

Comme je l'ai mentionné dans les commentaires ci-dessus, j'ai utilisé le module HTTP Akka pour créer des applications hautement évolutives et fiables dans le passé, et elles sont toutes basées sur Actor / Future.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top