2013-04-13 12 views
5

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:

  1. ist das sinnvoll von einem Design-Sicht?
  2. 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?
  3. 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.

Antwort

3

Eine ganze Reihe von Fragen hier.Schnelle Antworten:

  1. Ja, ich denke schon.

  2. Sie möchten wahrscheinlich eine Actor-Klasse als Aggregator, Master oder Koordinator verwenden, die Bildabruf- und Bildverarbeitungsklassen startet. Der Aggregator enthält dann die Logik für den Fall, dass Ihre gesamte Berechnung als abgeschlossen betrachtet werden kann. Es gibt einige Beispiele für solche Dinge, die im Internet herumlaufen. Wenn Sie konkrete Beispiele finden wollen, die zu Ihren Aktivitäten passen, sollten Sie sich Akka 2.1.x-Beispiele ansehen, da Sie das wahrscheinlich brauchen, wenn Sie Verwenden Sie die aktuelle Scaletra-Codebasis.

  3. Es könnte eine gute Idee sein. Scalatra hat eine Integration mit dem Atmosphere-Framework, was es ziemlich einfach macht, WebSocket/Comet Long-Polling durchzuführen. Sie können über in the docs lesen. Ob es für Ihre Anwendung sinnvoll ist, hängt von vielen Faktoren ab, aber es lohnt sich, sie zu betrachten. Meiner Erfahrung nach kann Socket-Programmierung manchmal erstaunlich sein und manchmal mühseliger sein, als es wert ist. Wenn Sie beispielsweise viele Proxies durchgehen, haben Websockets Probleme, wenn SSL nicht verwendet wird. Es ist jedoch eine schöne Sache, dass Informationen in den Client gelangen, sobald sie verfügbar sind.

Zur anderen Frage, über ActorSystem Schöpfung:

In Scalatra, Ihre Controller auf einer Pro-Anfrage und instanziert werden; Das ActorSystem in Ihrem Beispielcode wird nur einmal initialisiert. Immer wenn eine Anfrage an die Tür kommt, wird eine neue Controller-Instanz mit einem Verweis auf das ActorSystem erstellt.

ActorSystem Erstellung ist a heavyweight operation, und sollte so oft wie möglich passieren.

+0

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

+0

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

+0

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