2013-08-05 6 views
6

Ich bin neu zu spielen Wie ich verstehe, könnte es falsch sein, Spiel-Framework ist nicht blockierend durch die Behandlung von Anfragen in einer asynchronen Art und Weise, lange blockierende Operationen sollten asynchron mit Versprechungen erfolgen. Wann sollte ich Versprechen oder abgebildete Versprechungen verwenden, um eine bestimmte Anfrage zu bearbeiten und wann nicht?Im Play-Framework, wann verwenden Sie Promises, um eine Anfrage zu bearbeiten und wann nicht?

Nehmen wir zum Beispiel an, ein Benutzer lädt eine Datei hoch, wenn sie an den Controller gelangt, verschiebe ich die Datei aus dem temporären Ordner in einen gewünschten Ordner und füge einen Datenbankeintrag ein. Dies beinhaltet 2 blockierende Operationen, das Verschieben und Einfügen der Datei in die Datenbank. Nehmen wir an, die Datei ist nicht groß, sagen wir 10MB, also sollte die Datei sich schnell bewegen. Und das Einfügen eines DB-Datensatzes sollte auch schnell mit einem blockierenden Datenbanktreiber erfolgen.

In diesem einfachen Fall, sollte ich ein Versprechen/Zukunft verwenden, um die 2 Operationen oder 2 abgebildete Versprechen zu machen (Datei verschieben dann db Datensatz einfügen) oder überhaupt kein Versprechen verwenden? Und warum?

Bitte teilen Sie Ihre Gedanken/Erfahrungen. Vielen Dank im Voraus.

Antwort

4

Es ist eigentlich eine feine Linie, und zu entscheiden, was in eine Zukunft hineingeht und was nicht am Ende ziemlich anwendungsabhängig ist.

Im Allgemeinen sollten Sie sich keine Gedanken darüber machen müssen, dass Sie in Zukunft Datenbankaufrufe tätigen müssen. Da der zugrundeliegende Treiber blockiert, werden Sie irgendwo blockieren, auch wenn Sie es in eine Zukunft oder einen Schauspieler setzen. Also: versuch die Latenz von db zu verringern. Stellen Sie sicher, dass Ihre Datenbank in der Nähe ist (Netzwerk topologisch) und über ausreichende Ressourcen verfügt.

def uploadFile() = Action { 
    Async { 
    // handle file moving 
    Ok 
    } 
} 

Lassen Sie sich sagt, Sie jedoch noch zwei teure Dinge mit der Datei zu tun haben:

ziemlich triviale Weise mit so etwas wie gehandhabt werden kann, die Datei in einer nicht blockierenden Weise bewegen. Wenn eine Aktion abhängig von der anderen ist, dann können Sie es organisieren, wie Sie möchten (in einer Zukunft ist völlig in Ordnung). Sie müssen die erste Aufgabe beenden, bevor Sie die zweite starten. Der Code kann jedoch mit zwei Futures am saubersten sein. High Level, etwas wie:

for { movedFile <- moveFile(file) 
    analyzedFile <- analyzeFile(movedFile) } yield analyzedFile 

scheint mir sauber. Aber fühle nicht, dass du jede winzige Handlung in ihre eigene Zukunft aufteilen musst.

Wenn Sie jedoch zwei Aufgaben haben, die unabhängig voneinander ausgeführt werden können, können Sie zwei Futures verwenden, um beides gleichzeitig zu tun.

+0

Vielen Dank Andrew für die klare Erklärung, die mir viel Sinn macht. – Kevin

Verwandte Themen