2013-01-12 15 views
6

Moja aplikacja musi być w stanie utworzyć strukturę drzewa aktorów. Standardowy sposób na to, jak sądzę, to umieszczenie kodu instancji wewnątrz aktorów, aby mogli utworzyć swoje dzieci. Podejściem, które wolałbym raczej być, by móc stworzyć aktora na danej ścieżce. Takich jak stworzenie aktor A w mySystem, a następnie możliwość bezpośredniego tworzenia akka: // mySystem/A/B i innych aktorów. Czy taka funkcjonalność istnieje? Uprościłoby to mój kod znacznie.Ręczne tworzenie hierarchii aktorów w akka

EDYCJA: Teraz, gdy nie ma mnie w telefonie, pozwól, że się rozwiną.

że mam klasę

class myActor extends actor 

i muszę dokonać n-drogi drzewa z nich. Zamiast kodu potrzebnego do wystąpienia własne dzieci w funkcji odbioru z czymś jak

case Create(n:Int) => {} 

szukam uproszczenie kodu myActor przez nie w tym żadnej z tych rzeczy, a zamiast tego jest w stanie tworzyć moją hierarchię na początku mojego kodu ręcznie. Więc idealnie coś takiego (zakładając hipotetyczną funkcją statycznego „stworzyć”):

val sys = ActorSystem("mySystem") 
Akka.Actors.Create("akka://mySystem/a", new myActor()) 
Akka.Actors.Create("akka://mySystem/a/b", new myActor()) 
Akka.Actors.Create("akka://mySystem/a/c", new myActor()) 

która powodowałaby drzewo Aktor:

a 
/\ 
b c 

Teraz, czy to istnieje? Czy istnieje lepszy sposób na zrobienie tego bez zagracania mojego kodu aktora za pomocą kodu instancji?

EDIT, runda 2:

Ok, wygląda ta funkcja nie istnieje. Zamiast tego stworzyłem sub-cechę aktora i wymusiłem tam cały mój kod instancji, aby moje konkretne klasy implementacji były nadal uporządkowane.

Odpowiedz

2

Każdy aktor ma rodzica. Aby zrobić to, co chcesz, potrzebujesz klasy Actor, aby służyć jako rodzic dla wszystkich innych aktorów (innych niż główny aktor). Ponieważ aktorzy-rodzice są synonimami nadzorujących aktorów, chciałbyś mieć jakiś sposób narzucenia strategii nadzoru, aby zastosować się do tych rodziców.

Przypuszczam, że można zdefiniować rodzica rodzica Actor, aby umieścić go w wewnętrznych pozycjach hierarchii aktorów i napisać metodę dekomponowania nazwy ścieżki aktora i utworzenia hierarchii dyktowanej przez jedną lub więcej z tych ścieżek. Prawdopodobnie chciałbyś określić strategię nadzoru i, minimalnie, funkcję receive do zainstalowania w aktorze liści.

Ponieważ tylko aktor może tworzyć swoje dzieci, rodzice musieliby odpowiadać na wiadomości dotyczące tworzenia swoich dzieci-aktorów (albo innych aktorów-rodziców lub aktorów-liściastów), w jakiś sposób wymyślając sposób wybierania podklasy Actor do tworzenia instancji dla aktorzy liścia.

Ale aby odpowiedzieć na twoje pytanie, nie ma w tym nic wbudowanego. Nie sądzę, że ma wystarczającą ogólną użyteczność, aby usprawiedliwić dodanie go do samej Akki.

2

Utwórz aktora root, z poziomu głównego aktora utwórz drzewo z numerem actorFor. Użyj application.conf w ścieżce klas, aby uzyskać statyczną konfigurację hierarchii nazw lub utwórz stałą strukturę adresów. Inną opcją są ścieżki analizowania i tworzenie elementów potomnych z przesunięciem preStart.Istnieją różne schematy nadzorowania cyklu życia dzieci, ponownego uruchamiania i przekazywania komunikatów w przejrzysty sposób za pośrednictwem jednego aktora.

4

Twoje pytanie zaczyna się od postulowania rozwiązania i niestety nie zawiera opisu problemu.

Drzewo aktorów należy przede wszystkim rozumieć jako hierarchię nadzoru: rodzic radzi sobie z niepowodzeniami swoich dzieci, a cykl życiowy rodzica ogranicza jego cykl życiowy. To, czy dany aktor powinien być dzieckiem drugiego, należy określić, biorąc pod uwagę te implikacje.

Mówię to, ponieważ twoje pytanie sugeruje, że modelujesz drzewo superwizji według jakiegoś innego kryterium, całkiem możliwe, aby nadużyć jako rejestr z system.actorFor jako mechanizmem wyszukiwania. Mogą być rzadkie przypadki, w których to działa, ale a priori nie poleciłbym tego; Wolałbym umieścić mapę haszyszu wewnątrz aktora dyspozytora i poradzić sobie z wyszukiwaniem. Jeśli wnioskujesz - przez pomiar - że nie działa wystarczająco dobrze, możesz skalować go, używając router.

Aby odpowiedzieć na twoje pytanie teraz: każdy rodzic musi stworzyć własne dzieci, co oznacza, że ​​musi w taki czy inny sposób zawierać kod, aby to zrobić. Możesz przekazać Props w dół hierarchii, aby jej części można było konfigurować, ale nie powinieneś pracować wokół what supervision means; zadaj sobie pytanie, co powinno się stać, jeśli jedna z liści się nie powiedzie, a następnie zadaj sobie pytanie, czy twoje przypuszczalne liście powinny zostać ponownie uruchomione i/lub zabite, gdy pośredni aktor zostanie ponownie uruchomiony.

+0

Widzę, że teoretycznie jest to dobra odpowiedź, ale nie mogę nie zauważyć, ile spaghetti kodu wynika z dużych hierarchii systemu aktorów. Centralna konfiguracja, o której mowa w pytaniu, może zapewnić mechanizm do jasnego zrozumienia ogólnej hierarchii dla praktycznych celów oprogramowania. Czy poleciłbyś jakąś alternatywną metodę wyjaśnienia złożonych hierarchii? Czy jest to po prostu sposób, w jaki należy nadać relacje między rodzicem a dzieckiem? –

+0

Trudno mi jest odpowiedzieć na to pytanie, ponieważ zdajesz się sugerować kontekst, którego nie mam. Systemy aktorów są zorganizowane w poddrzewach zapewniających określoną funkcjonalność, w tym sensie, że są bardzo modułowe. Punktem wyjścia dla każdego z tych submodułów jest jego najlepszy aktor, który faktycznie JEST swoim całym poddrzewem. Widzę, jak złamanie tego modelu przez próbę zainstalowania aktorów w obrębie poddrzew z zewnątrz dałoby kod spaghetti, ponieważ po prostu nie jest to zamierzone. Kiedy aktor musi stworzyć dziecko, może na przykład spojrzeć na konfigurację, aby ustalić, jak to zrobić. –

Powiązane problemy