Akka nicht blockierende Optionen, wenn eine HTTP-Antwort angefordert wird

8

Ich verstehe, wie man eine nachrichtenbasierte, nicht blockierende Anwendung in akka erstellt und Beispiele, die funktionieren, leicht nachbilden kann gleichzeitige Operationen und geben die aggregierten Ergebnisse in einer Nachricht zurück. Wo ich Schwierigkeiten habe, verstehe ich Nicht blockierende Optionen sind, wenn meine Anwendung auf eine HTTP-Anfrage antworten muss. Ziel ist es, eine Anfrage zu erhalten und übergebe es sofort an einen lokalen oder entfernten Schauspieler, um die Arbeit zu machen, die es dann weitergibt, um ein Ergebnis zu erhalten könnte etwas dauern. Leider verstehe ich unter diesem Modell nicht, wie ich das mit einem Non-Blocking ausdrücken könnte eine Reihe von "Tells" anstatt "Anfragen" zu blockieren. Wenn ich an irgendeinem Punkt in der Kette einen Tell benutze, habe ich keine Zukunft mehr Verwenden Sie als eventuellen Antwort Inhalt (erforderlich von der http-Framework-Schnittstelle, die in diesem Fall finagle ist - aber das ist nicht wichtig). Ich verstehe die Anfrage ist auf einem eigenen Thread, und mein Beispiel ist ziemlich erfunden, aber nur zu versuchen verstehe meine Designoptionen.

Zusammenfassend: Wenn mein künstliches Beispiel unten so überarbeitet werden kann, dass es weniger blockiert, dann liebe ich es sehr zu verstehen, wie. Das ist mein Erste Verwendung von akka seit einigen Licht-Exploration vor einem Jahr und in jedem Artikel, Dokument und sprechen, die ich gesehen habe sagt nicht für Dienste blockieren.

Konzeptuelle Antworten können hilfreich sein, können aber auch die gleichen sein wie das, was ich bereits gelesen habe. Mein Beispiel bearbeiten / bearbeiten wäre wahrscheinlich der Schlüssel zu meinem Verständnis des genauen Problems, das ich versuche zu lösen. Wenn das aktuelle Beispiel allgemein ist Was getan werden muss, ist die Bestätigung auch hilfreich, also suche ich nicht nach Magie, die nicht existiert.

Hinweis Die folgenden Aliase: import com.twitter.util. {Future = & gt; TwitterFuture, Warten = & gt; TwitterAwait}

%Vor%

Vielen Dank im Voraus für jede angebotene Anleitung!

    
Eric 21.08.2013, 18:23
quelle

2 Antworten

5

Sie können vermeiden, eine Zukunft als Nachricht zu senden, indem Sie Rohrmuster -ie, in Worker1 würdest du schreiben:

%Vor%

Anstelle von:

%Vor%

Jetzt ist r ein Future[String] anstelle von Future[Future[String]] .

Update: Die obige pipe -Lösung ist eine allgemeine Methode, um zu vermeiden, dass Ihr Akteur mit einer Zukunft reagiert. Wie Viktor in einem Kommentar unten erwähnt, in diesem Fall können Sie Ihre Worker1 vollständig aus der Schleife nehmen, indem Sie Worker2 direkt auf den Akteur antworten, von dem sie ( Worker1 ) die Nachricht erhalten hat:

%Vor%

Dies ist keine Option, wenn Worker1 für die Verarbeitung der Antwort von Worker2 verantwortlich ist (indem map für w2 ? "do work" verwendet wird, mehrere Futures mit flatMap oder a% co_de kombiniert werden) % -Komprehension, etc.), aber wenn das nicht notwendig ist, ist diese Version sauberer und effizienter.

Das kostet 1 for . Sie können den anderen loswerden, indem Sie etwas wie folgt schreiben:

%Vor%

Jetzt müssen Sie diese Await.result nur noch in Future umwandeln. Ich kann dir nicht genau sagen, wie ich das machen soll, aber es sollte ziemlich trivial sein, und erfordert definitiv keine Blockierung.

    
Travis Brown 21.08.2013, 18:58
quelle
0

Sie müssen hier auf keinen Fall blocken. Aktualisieren Sie zunächst Ihren Import für die Twitter-Inhalte auf:

%Vor%

Sie benötigen den twitter Promise als Impl von Future , den Sie von der Methode apply zurückgeben. Dann folge dem, was Travis Brown in seiner Antwort gesagt hat, so dass dein Akteur so reagiert, dass du keine verschachtelten Futures hast. Sobald Sie das getan haben, sollten Sie in der Lage sein, Ihre apply -Methode in etwa so zu ändern:

%Vor%

Das braucht wahrscheinlich ein bisschen mehr Arbeit. Ich habe es nicht in meiner IDE eingerichtet, daher kann ich nicht garantieren, dass es kompiliert wird, aber ich glaube, die Idee ist solide. Was Sie von der Methode apply zurückgeben, ist eine TwitterFuture , die noch nicht abgeschlossen ist. Es wird abgeschlossen sein, wenn die Zukunft vom Akteur ask (?) Erledigt ist und dies über einen nicht blockierenden onComplete Callback geschieht.

    
cmbaxter 21.08.2013 20:22
quelle

Tags und Links