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:
- Czy to sensowne z punktu widzenia projektu?
- 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?
- 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.
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
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
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