verstehe ich das richtig: Der ‚def Endpunkt‘ ist eine synchrone Sperrmethode, und Sie können diese Tatsache nicht ändern, da es von einem Rahmen diktiert?
Nun, das heißt, Sie müssen dort blockieren, warten auf die Berechnung/IO zu Ihnen zurückkommen. Das bedeutet auch, dass Sie dort einen Thread verwenden.
Ich denke, das Beste, was Sie tun können, um das Überladen dieses Endpunkts mit vielen wartenden Threads zu verhindern. Also:
- Wie Sie, geben Sie eine Zeitüberschreitung ein.
- Denken Sie darüber nach, wie viele "wartende Threads" Sie akzeptieren möchten. Dann mehr Anfragen abwerfen, wenn zu viele warten. Wie:
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()
}
}
können Sie haben einen Blick auf die scala parallel Sammlungen – alifirat
Dank für Ihren Kommentar. Ich bin mir nicht sicher ob ich das kann, da jede Aufgabe unabhängig ist, eine Audiodatei zum Beispiel per Anfrage mutiert. Sie werden nicht aggregiert - sondern verarbeitet und jeweils an ihren jeweiligen Kunden zurückgegeben. – tgk