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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top