2016-04-22 7 views
0

Exploring die HTTP-Client-Binder Feign und ich sehe, dass es does not support Callback-Ergebnisse (DeferredResults). Wie würde ich dann mit der Erstellung eines skalierbaren Endpunkts umgehen, um viele zeitintensive Aufgaben parallel auszuführen? so etwas wie dies versuchen zu vermeiden:Erstellen einer skalierbaren Lösung ohne Futures?

val slowComputation : Future[Array[Bytes] = ??? 

def endpoint = { 
    Await.result(slowComputation(), Duration(1, SECONDS)) 
} 
+0

können Sie haben einen Blick auf die scala parallel Sammlungen – alifirat

+0

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

Antwort

1

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() 
    } 
} 
+0

Danke Gamlor, tolle Notizen, yeah genau ich bin durch das Framework begrenzt, also ist es schön zu hören, dass ich die Threads auf irgendeine Weise verwalten muss und dein Beispiel hilft. – tgk