Ich verstehe, wie Sie eine Nachricht nicht blockierende Anwendung in akka, und können einfach Beispiele, die gleichzeitige Operationen durchführen und die aggregierten Ergebnisse in einer Nachricht zurückgeben. Wo ich Schwierigkeiten habe, zu verstehen, was meine nicht blockierenden Optionen sind, wenn meine Anwendung auf eine HTTP-Anfrage antworten muss. Das Ziel ist, eine Anfrage zu erhalten und sofort an einen lokalen oder entfernten Akteur zu übergeben, der die Arbeit erledigt, die wiederum es ausgibt, um ein Ergebnis zu erhalten, das einige Zeit dauern könnte. Leider verstehe ich unter diesem Modell nicht, wie ich dies mit einer nicht blockierenden Serie von "Tells" ausdrücken könnte, anstatt "ask" zu blockieren. Wenn ich an irgendeinem Punkt in der Kette einen Tell verwende, habe ich keine Zukunft mehr für als eventuellen Antwort-Inhalt zu verwenden (benötigt 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 versuchen, meine Design-Optionen zu verstehen.Akka nicht blockierende Optionen, wenn eine HTTP-Antwort erforderlich ist
Zusammenfassend, Wenn mein künstliches Beispiel unten überarbeitet werden kann, um weniger zu blockieren, ich liebe es sehr zu verstehen, wie. Dies ist meine 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 Dienstleistungen blockieren.
Konzeptionelle Antworten können hilfreich sein, können aber auch die gleichen sein wie das, was ich bereits gelesen habe. Das Bearbeiten/Bearbeiten meines Beispiels wäre wahrscheinlich der Schlüssel zu meinem Verständnis des genauen Problems, das ich zu lösen versuche. Wenn das aktuelle Beispiel in der Regel ist, was zu tun ist, dass die Bestätigung auch hilfreich ist, so suche ich nicht nach Magie, die nicht existiert.
Hinweis Die folgenden Aliase. Import com.twitter.util {Zukunft => Pressezukunfts, Await => TwitterAwait}
object Server {
val system = ActorSystem("Example-System")
implicit val timeout = Timeout(1 seconds)
implicit def scalaFuture2twitterFuture[T](scFuture: Future[T]): TwitterFuture[T] = {
val promise = TwitterPromise[T]
scFuture onComplete {
case Success(result) ⇒ promise.setValue(result)
case Failure(failure) ⇒ promise.setException(failure)
}
promise
}
val service = new Service[HttpRequest, HttpResponse] {
def apply(req: HttpRequest): TwitterFuture[HttpResponse] = req.getUri match {
case "https://stackoverflow.com/a/b/c" =>
val w1 = system.actorOf(Props(new Worker1))
val r = w1 ? "take work"
val response: Future[HttpResponse] = r.mapTo[String].map { c =>
val resp = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK)
resp.setContent(ChannelBuffers.copiedBuffer(c, CharsetUtil.UTF_8))
resp
}
response
}
}
//val server = Http.serve(":8080", service); TwitterAwait.ready(server)
class Worker1 extends Actor with ActorLogging {
def receive = {
case "take work" =>
val w2 = context.actorOf(Props(new Worker2))
pipe (w2 ? "do work") to sender
}
}
class Worker2 extends Actor with ActorLogging {
def receive = {
case "do work" =>
//Long operation...
sender ! "The Work"
}
}
def main(args: Array[String]) {
val r = service.apply(
com.twitter.finagle.http.Request("https://stackoverflow.com/a/b/c")
)
println(TwitterAwait.result(r).getContent.toString(CharsetUtil.UTF_8)) // prints The Work
}
}
Vielen Dank im Voraus für jede angebotene Führung!
Vielen Dank für Ihre schnelle Antwort Travis. Das bereinigt die Zukunft und die Erwartungen ein wenig. Also glaubst du, dass die Verwendung der zwei Fragen tatsächlich erforderlich ist (Natürlich konnte ich es nur so sehen - aber wollte sicher gehen)? Ich werde meinen Code aktualisieren, um Ihre Verbesserungen einzubeziehen und die impliziten Konvertierungen von einer Akka-Zukunft in eine Twitter-Zukunft zu integrieren. Ich kenne mich noch nicht so gut mit der Stack Overflow-Etikette aus, daher gebe ich ein +1 für Verbesserungen. Jede zusätzliche Information zu den Fragen wäre hilfreich. Vielen Dank! – Eric
Es ist schwer zu sagen, ob die Fragen erforderlich sind, ohne mehr darüber zu wissen, wofür diese Akteure verantwortlich sind, aber der wichtige Teil ist, dass Fragen nicht blockiert werden müssen (es gibt ein wenig zusätzliche Buchhaltung, aber es ist immer noch asynchron). Ich würde auch vorschlagen, die Konvertierung zwischen Twitter und Standard-Bibliotheks-Futures explizit zu halten - eine Conversion-Methode aufrufen zu müssen, ist in der Regel ein kleiner Preis, um mögliche Verwirrung in einem Fall wie diesem zu vermeiden. –
Vielen Dank für Ihre Hilfe und Einblicke in dieses Travis. Das löst meine Sorgen perfekt. – Eric