2011-09-09 1 views
1

J'ai un webservice qui fait un certain nombre de requêtes de base de données (à MongoDB) et fait ensuite une quantité non-triviale de traitement sur les enregistrements retournés par ces requêtes de base de données. Chaque requête Web doit exécuter environ 15 à 45 de ces demandes, ce qui entraîne des temps de réponse de page inacceptables, chaque requête + traitement prenant environ 20 ms. La mise en cache ne fonctionnera pas car le taux de cache-miss sera élevé et les données devront être aussi fraîches que possible. J'avais prévu d'utiliser Scala + Akka et les acteurs pour paralléliser la classe exécutant et traitant les requêtes mais je sais que la création de threads dans un conteneur de servlet est déconseillée. Quelle est la méthode recommandée pour faire du threading/parallélisation dans une requête web dans Scala?Parallélisation/threads dans une requête web en Scala/Java?

+0

Je ne réponds pas à votre question car, si vous ne pouvez pas avoir plus d'un thread, je n'ai aucune idée de la façon dont vous êtes en parallèle. Ce que je dirais c'est qu'utiliser Akka Actors ne serait probablement pas une bonne idée. Akka Futures serait le chemin à parcourir ici. –

+0

@Derek Je pense que c'est ma question, est-ce que je peux utiliser Actors dans mon code dans une requête web dans Scala + Akka? Je veux avoir plus d'un thread, enveloppant la classe qui fait la requête et le traitement dans un acteur. J'envisage Futures, mais je voulais aussi savoir si je pouvais utiliser des acteurs. –

+0

J'ai réussi à écrire des applications hautement fiables et évolutives avec Mist - le complément HTTP d'Akka qui place un shing Actor entre votre logique métier et le Web Container. Donc je ne vois pas pourquoi il y a un problème avec ça. –

Répondre

3

Je ne vois pas pourquoi vous ne pouvez pas utiliser Akka's Futures pour ça (j'utilise le 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... 
    } 
} 

(Et il y a certainement plus d'une façon de faire face à terme à Akka pour répondre à vos besoins. Cet exemple peut ne pas être idéal pour ce que vous voulez)

Jetez un oeil à l'excellente documentation Akka pour Plus d'infos: Akka 1.2R6 Future documentation

Comme je l'ai mentionné dans les commentaires ci-dessus, j'ai utilisé the Akka HTTP module pour construire des applications hautement évolutives et fiables dans le passé, et ils sont tous basés sur l'acteur/l'avenir.

Questions connexes