Dies ist eine zweiteilige Frage, erstens mehr eine Design-Frage als, wie es zu implementieren ist, und zweitens einige Umsetzung Bedenken mit Akka.Akka, Scalatra und Web State Fragen
Ich verwende Scalatra, um einen REST-Service-Endpunkt zu erstellen, der, wenn er aufgerufen wird, Bilder aus verschiedenen Quellen zieht, manipuliert und zurückgibt. Dies ist möglicherweise ein ziemlich langwieriger Prozess und wird wahrscheinlich länger dauern als für einen einzelnen http-Anfrage/Antwort-Zyklus akzeptabel ist.
Meine Gedanken zu diesem ist, dass, wenn der Anruf gemacht wird, werde ich eine Reihe von Akka Actors zu ziehen, um die Bildressourcen zu ziehen, und sie das Ergebnis an Bildverarbeitungsakteure zu skalieren etc. Die ursprüngliche Anfrage selbst zurückgeben würde sofort eine Art Verarbeitungs-ID, die verwendet werden kann, um nachfolgende Abrufaufrufe zu einem anderen Endpunkt zu machen, der die Ergebnisse bei der Verarbeitung zurückgibt, mit einem Flag, um festzustellen, ob mehr Ergebnisse verfügbar sind, damit der Client weiß, dass er die Abfrage beendet.
Meine Fragen sind wie folgt:
- ist das sinnvoll von einem Design-Sicht?
- Wenn ich diesen Ansatz verwende, dann müsste jede nachfolgende Anforderung zum Abrufen der verarbeiteten Bilder eine Art von Zustandsanzeige haben, um zu wissen, welche Bilder der Client bereits empfangen hat. Wie würdest du diesen Staat verwalten?
- Ich habe mir das nie angesehen, aber würde eine lang laufende HTTP-Anfrage im Kometen-Stil mehr Sinn machen als das Abfragen in dieser Situation?
Implementierung Teil
Unter der Annahme, ich ähnlich wie oben mit einem Entwurf am Ende, ich bin sehr neu in Scalatra & Akka (oder einem Schauspieler Paradigma) und ich habe ein paar Fragen.
Ok, erste ist eine Scala/Scalatra spezifische Frage I denken. Ok, habe ich mich die Scalatra docs auf Akka http://www.scalatra.org/guides/async/akka.html, und in diesem Beispiel sie Setup die Anwendungen Bootstrap wie folgt:
// Get a handle to an ActorSystem and a reference to one of your actors
val system = ActorSystem()
val myActor = system.actorOf(Props[MyActor])
// In the init method, mount your servlets with references to the system
// and/or ActorRefs, as necessary.
override def init(context: ServletContext) {
context.mount(new PageRetriever(system), "/*")
context.mount(new MyActorApp(system, myActor), "/actors/*")
}
Ich gehe davon aus, dass das bootstraping von scalatra beim Anwendungsstart einmal passiert, so tut system.actorOf (Props [MyActor]) erstellen eine einzelne Instanz oder eine pro Anfrage?
Zweitens sagen meine MyActor Klasse (oder ein vernünftiger Name) hat die folgende:
class MyActor extends Actor {
def receive = {
//Find the [ImageSearchingActor] actor in akka registry and send search message
case initiateSearchRequest: InitiateSearchRequestMessage => TODO
//Find free [ImageProcessingActors] in akka registry and send each Image url to process
case imageInformationFound : ImageInformationFoundMessage => TODO
//Persist the result to a cache, or data store with the ProcessingId that all message will pass
case imageProcessed : ImageProcessedMessage => TODO
}
}
Nun, in diesem Fall mehrere gibt es mehrere Orte werde ich Bilder werden das Abrufen und so mehrere Schauspieler werden Grabbing diese Daten. Wenn sie geeignete Bilder finden, werden mehrere Akteure verwendet, um die Bilder zu verarbeiten. Wenn ich mit meinem Design gehe, muss ich irgendwo markieren, dass für eine bestimmte ProcessingId keine verarbeiteten Bilder mehr verfügbar sind. Dies bedeutet, dass ich wissen muss, wann ALLE Bildsuch- und Bildverarbeitungsakteure für eine bestimmte ProcessingId fertig sind. Wie mache ich das?
Also das war eine Menge Frage, Infos zu konsumieren Ich hoffe, es hat Sinn gemacht.
Prost. Chris.
Sehr vollständige Antwort, danke. Ich denke jetzt, dass der Komet keinen Sinn ergibt, da diese Anfragen aus mehreren Quellen kommen und ich möchte ihnen das nicht aufzwingen. Ich werde dies als korrekt bezeichnen, aber ich vermisse den Punkt darüber, wie das ActorSystem Akteure instanziiert. Das liegt daran, wie ich meine Frage gestellt habe, die beim erneuten Lesen blöd ist :-). – Owen
Also fragte ich, ob system.actorOf (Props [MyActor]) würde eine neue MyActor pro Anfrage einfügen, aber offensichtlich wird es nicht. Aber wenn ich den Verweis auf MyActor nicht an den Controller und nur den Verweis an das ActorSystem weitergeben würde, würde ActorOf jedes Mal eine neue Instanz erstellen? Wenn ja, wie kontrolliere ich die Anzahl der geschaffenen Akteure? Im Idealfall möchte ich einen Pool dieser Jungs zur Auswahl. Eigentlich sollte ich auf den zweiten Gedanken verzichten, ich sollte die Dokumente noch etwas lesen und aufhören, Fragen zu stellen :-) – Owen
Ich glaube, ich habe ein bisschen negativ auf der Vorderseite der Buchse geklungen. Beachten Sie, dass Atmosphere in Situationen, in denen die Websockets nicht stabil bleiben, auf lange Abfragen zurückgreift, so dass sie immer noch einen Versuch wert sind. – futurechimp