2013-04-13 10 views
5

Jest to dwuczęściowe pytanie, po pierwsze bardziej pytanie projektowe niż jak je wdrożyć, a po drugie pewne wątpliwości dotyczące implementacji z Akka.Pytania dotyczące Akka, Scalatra i Web State

Używam Scalatra do zbudowania punktu końcowego usługi REST, który po wywołaniu będzie pobierał obrazy z kilku źródeł, manipulować nimi i zwracać je. Jest to potencjalnie dość długi proces i prawdopodobnie będzie dłuższy, niż jest akceptowalny w przypadku pojedynczego żądania HTTP/cyklu odpowiedzi.

Moje przemyślenia na ten temat polegają na tym, że kiedy wezwę, wyrzucę grupę aktorów akka, aby wyciągnąć zasoby obrazu, i każę im przekazać wyniki do osób zajmujących się przetwarzaniem obrazu, aby skalować itd. Początkowe żądanie samo wróci natychmiast pojawia się jakiś Identyfikator przetwarzania, który może być użyty do wykonywania kolejnych połączeń odpytywania do innego punktu końcowego, który zwróci wyniki podczas ich przetwarzania, z flagą w celu ustalenia, czy dostępnych jest więcej wyników, aby poinformować klienta o konieczności zatrzymania odpytywania.

Moje pytania są następujące:

  1. Czy to sensowne z punktu widzenia projektu?
  2. Jeśli skorzystam z tego podejścia, każde kolejne żądanie pobrania przetworzonych obrazów będzie musiało mieć pewną świadomość stanu, aby wiedzieć, jakie obrazy klient już otrzymał. Jak zarządzałbyś tym stanem?
  3. Nigdy nie patrzyłem na to, ale czy długotrwałe żądanie HTTP w stylu komety miałoby więcej sensu niż sondowanie w tej sytuacji?

Część Realizacja

Zakładając, że nie kończy się z projektu podobnego do powyższego, jestem bardzo nowy Scalatra & Akka (lub jakiegokolwiek paradygmatu aktor) i mam kilka pytań.

Ok, pierwszy to specyficzne pytanie Scala/Scalatra I think. Ok, spojrzałem na docs Scalatra na Akka http://www.scalatra.org/guides/async/akka.html, w tym przykładzie, że konfiguracja aplikacje bootstrap następująco:

// 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/*") 
    } 

Zakładam, że bootstraping z scalatra zdarza się raz na starcie aplikacji, więc nie system.actorOf (Rekwizyty [MyActor]) tworzą pojedynczą instancję lub jedną na żądanie?

drugie, że moja klasa MyActor (lub bardziej sensowne nazwy) zrobił następujący:

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 
    } 
} 

Teraz, w tym przypadku wielokrotności istnieje wiele miejsc będę odtwarzanie obrazów i tak kilka podmiotów będzie chwytając te dane. Po znalezieniu odpowiednich obrazów do przetworzenia obrazów zostanie wykorzystanych kilka Aktorów. Jeśli pójdę z moim projektem, muszę gdzieś zaznaczyć, że dla danego ProcessingId nie ma już dostępnych przetworzonych obrazów. Oznacza to, że muszę wiedzieć, kiedy zakończyło się WSZYSTKIE wyszukiwanie obrazów i aktorzy przetwarzania obrazu dla danego ProcessingId. Jak mam to zrobic?

To było dużo pytań, informacji do skonsumowania Mam nadzieję, że to miało sens.

Pozdrawiam. Chris.

Odpowiedz

3

Dość kilka pytań tutaj.Szybkie odpowiedzi:

  1. Tak, myślę, że tak.

  2. Prawdopodobnie chcesz użyć jednej klasy Aktora jako agregatora, wzorca lub koordynatora, który uruchamia pobieranie obrazów i przetwarzanie obrazów Klasy aktorów. Agregator następnie zawiera logikę, kiedy twoje ogólne obliczenia można uznać za kompletne. Istnieje wiele przykładów tego typu rzeczy pływających w Internecie, jeśli chcesz konkretnych przykładów, aby dopasować to, co robisz, upewnij się, że patrzysz na przykłady Akka 2.1.x, ponieważ jest to prawdopodobnie potrzebne, jeśli " ponownie korzystać z aktualnej bazy kodów Scalatra.

  3. To może być dobry pomysł. Scalatra ma integrację ze strukturą Atmosphere, co sprawia, że ​​bardzo łatwo jest wykonywać długie wybieranie w sieci Web/kometę. Możesz przeczytać o in the docs. To, czy ma to sens dla twojej aplikacji, zależy od wielu czynników, ale warto na nią patrzeć. Z mojego doświadczenia wynika, że ​​programowanie w gniazdach może czasami być niesamowite, a czasem może być bardziej kłopotliwe, niż jest to warte - jeśli przechodzisz przez wiele serwerów proxy, na przykład, sieci internetowe mają problemy, chyba że SSL jest w użyciu. Jednak jest rzeczą piękną, gdy informacje są przekazywane do klienta, gdy tylko są dostępne.

Do innych kwestii, o stworzeniu ActorSystem:

W Scalatra, kontrolery są instancja na podstawie na żądanie; ActorSystem w przykładowym kodzie zostanie tylko raz zainicjowany. Za każdym razem, gdy żądanie przychodzi do drzwi, tworzona jest nowa instancja kontrolera, z odniesieniem do ActorSystem.

Tworzenie ActorSystem to a heavyweight operation i powinno się zdarzyć tak mało razy, jak tylko można sobie wyobrazić.

+0

Bardzo kompletna odpowiedź, dziękuję. Teraz myślę, że kometa nie ma sensu, ponieważ te wnioski będą pochodzić z różnych źródeł i nie chcę narzucać tego na nich. Zaznaczę to jako poprawne, ale brakuje mi punktu o tym, jak ActorSystem tworzy instancję. Wynika to z tego, jak zadałem moje pytanie, które jest głupie po ponownym przeczytaniu :-). – Owen

+0

Więc zapytałem, czy system.actorOf (Props [MyActor]) uruchomi nowego MyActor na żądanie, ale oczywiście nie będzie. Ale jeśli nie przekazałbym referencji do MyActor do kontrolera, a tylko refację do ActorSystem, czy wywołanie actorOf za każdym razem tworzy nową instancję? Jeśli tak, to w jaki sposób kontrolować liczbę utworzonych aktorów? Idealnie, chcę mieć do wyboru pulę tych facetów do wyboru. Właściwie, na drugi rzut oka, nieważne, powinienem jeszcze przeczytać dokumenty i przestać zadawać pytania :-) – Owen

+0

Chyba zabrzmiało to trochę negatywnie na czole gniazda. Należy pamiętać, że Atmosphere powraca do długiego sondowania w sytuacjach, w których sieci Web nie będą stabilne, więc warto je wypróbować. – futurechimp

Powiązane problemy