2016-04-14 2 views
0

Der Webclient wird blockiert, während auf die Antwort gewartet wird, aber auf dem Server wird nichts blockiert, und Serverressourcen können verwendet werden, um andere Clients zu bedienen.Spielframework, das lange blockierende Aufgaben ausführt, ohne den Client zu blockieren

Einige der Clientanforderungen erfordern, dass mein Server lange blockierende Aufgaben ausführt. Ich verstehe, dass ich sie in einem separaten Thread-Pool ausführen kann.
Aber ich möchte auch nicht, dass der Client blockiert wird. Ich möchte nur eine sofortige Antwort an den Client (z. B. OK hat Ihre dicke lange blockierende Aufgabe) zurückgeben. Der Client kümmert sich nicht darum, das Ergebnis der Taskausführung zu erhalten, sondern muss nur wissen, dass ich an der Ausführung arbeite.

Wie kann ich dieses Verhalten im Spiel implementieren?

Ich denke, ich kann eine Auftragswarteschlange erstellen und einen anderen Thread verwenden, um die Auftragswarteschlange zu verarbeiten. Wenn der Spielcontroller den Job nur zur Warteschlange hinzufügt und der andere Thread die Jobs aus der Warteschlange ausführt. Soll ich das tun? Soll ich Akka Schauspieler benutzen? (Ich weiß nicht, Akka ich es müssen lernen)

Antwort

1

Rückrufe

hat alles mit der Rückrufe gestartet. Dies ist die Definition einen Rückruf in JavaScript

Something.save(function(err) { 
    if (err) { 
    //error handling 
    return; 
    } 
    console.log('success'); 
}); 

- etwas, das Asynchron ausgeführt wird zu:

Sie haben dieses sicherlich gesehen. Dank ihrer Syntax, Implementierung und was nicht, sind Callbacks nicht wirklich dein Freund. Überbeanspruchend können sie zu den gefürchteten Rückruf Hölle führen

Promises

In diesem Zusammenhang: Promises in ES6

Something.save() 
    .then(function() { 
    console.log('success'); 
    }) 
    .catch(function() { 
    //error handling 
    }) 

Versprechungen sind keine 'ES6-Ding', haben sie seit vielen Jahren ES6 bringt sie zu dir. Versprechen sind nett, Sie können sogar Ketten Sie:

saveSomething() 
    .then(updateOtherthing) 
    .then(deleteStuff) 
    .then(logResults); 

Aber genug mit async für die Wahnsinnigen.

WebSocket

WebSocket ist etwas, was ich empfehlen würde:

  • ab heute very well supported
  • wunderbare Unterstützung in Play 2.x
  • Vollduplex-TCP
  • Sie endlich Zeit finden Akka zu lernen;)

Sie können also einen Client erstellen, der eine WebSocket-Verbindung zur Play-Anwendung öffnet. Auf der Server-Seite können Sie handle WebSocket connections either with Akka actors (was ich empfehlen) oder mit Rückrufen auf Streams.Die Verwendung von Schauspielern ist wirklich einfach und macht auch Spaß - Sie definieren einen Schauspieler - und sobald jemand eine WebSocket-Verbindung öffnet, wird eine Instanz dieses Schauspielers erzeugt und dann wird jede Nachricht, die Sie im WebSocket-Kanal erhalten haben, vom Schauspieler - Ihnen - empfangen kann sich auf Ihre Geschäftslogik konzentrieren, ohne über die Umgebung nachzudenken, und dann die Botschaft zurückschicken - etwas, das Akka auszeichnet.