Est-ce que je comprends bien: Le « point final def » est une méthode de blocage synchrone, et vous ne pouvez pas changer ce fait, car elle dictée par un cadre? Maintenant, cela signifie que vous devez bloquer là en attendant que le calcul/IO revienne à vous. Cela signifie également que vous utilisez un thread là-haut.
Je pense que le mieux que vous pouvez faire pour éviter de «surcharger» ce point de terminaison avec de nombreux threads en attente. Donc:
- Comme vous l'avez fait, spécifiez un délai d'expiration. Réfléchissez au nombre de «threads en attente» que vous êtes prêt à accepter.
- Puis jetez plus de demandes si beaucoup attendent. Comme:
val waiting = new AtomicInteger(0)
val maxThreadsWaiting = 200
def endpoint() ={
try{
val numberThreadsWaiting = waiting.incrementAndGet()
if(numberThreadsWaiting > maxThreadsWaiting) {
// Return 'overload' failure. Like HTTP 503
} else{
Await.result(slowComputation(), Duration(1, SECONDS))
}
} finally {
waiting.decrementAndGet()
}
}
Vous pouvez jeter un oeil aux collections parallèles scala – alifirat
Merci pour votre commentaire. Je ne suis pas sûr que je peux parce que chaque tâche est indépendante, en mutant un fichier audio par exemple par requête. Ils ne sont pas agrégés - mais traités et renvoyés à leur client respectif. – tgk