Parallelizzazione/thread all'interno di una richiesta Web in Scala/Java?
-
28-10-2019 - |
Domanda
Ho un servizio Web che sta facendo una serie di query di database (a MongoDB) e quindi effettuando una quantità non banale di elaborazione sui record restituiti da tali query di database. Ogni richiesta Web deve eseguire circa 15-45 di queste richieste che causano tempi di risposta di pagina inaccettabili in quanto ogni elaborazione di query + richiede circa 20 ms. La memorizzazione nella cache non funzionerà poiché il tasso di cache-miss sarà elevato e i dati devono essere il più freschi possibile.
Avevo programmato di utilizzare Scala + Akka e attori per parallelizzare l'esecuzione e l'elaborazione delle query, ma so che la creazione di thread all'interno di un contenitore servlet è scoraggiata. Qual è il modo consigliato di fare thread/parallelizzazione all'interno di una richiesta Web in Scala?
Soluzione
Non vedo perché non puoi usare i futuri di Akka per questo (sto usando l'istantanea 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...
}
}
(E c'è sicuramente più di un modo per affrontare i futures in Akka per soddisfare le tue esigenze. Quell'esempio potrebbe non essere l'ideale per quello che vuoi)
Dai un'occhiata all'eccellente documentazione di Akka per maggiori informazioni: Akka 1.2r6 Documentazione futura
Come ho già detto nei commenti sopra, ho usato il modulo Akka HTTP Costruire app altamente scalabili e affidabili in passato e sono tutti basati su attore / futuro.