Codziennie pracuję z akką od 7-8 miesięcy. Kiedy zaczynałem, pracowałem nad aplikacjami i zauważyłem, że aktorzy będą wykorzystywani praktycznie w dowolnym miejscu w systemie aktorów do komunikacji między większością obiektów. Więc zrobiłem to samo - podkręć innego aktora dla x / y / z.
Wydaje mi się, że może to być zbyt niedyskryminujące, co zwiększa złożoność tam, gdzie nie jest potrzebne - ale nie mogę znaleźć dyskusji na temat tego, gdzie należy zastosować aktorów kontra zwykłą synchronizację, a nawet asynchroniczną logikę poprzez futures. Zacząłem się zastanawiać, kiedy mój współpracownik wspomniał o czymś podobnym. Niedawno zdałem sobie sprawę z kilku przypadków, w których zastanawiałem się nad zadaniem, a następnie uniknąłem tworzenia innego aktora, ponieważ mogłem bezpiecznie osiągnąć ten sam wynik w niezmiennej implementacji - np. Coś takiego jak uzyskiwanie wartości konfiguracyjnych z bazy danych lub pliku w miejscu, do którego bardzo rzadko i gdzie uzyskujesz dostęp oczekiwanie na wynik to rzeczywisty przypadek użycia.
W szczególności wydaje mi się, że w każdym przypadku, gdy grasz z niezmiennym stanem, aktorzy tworzą złożoność i ograniczają przepustowość - na przykład czystą funkcję w obiekcie można wywoływać jednocześnie bez żadnego ryzyka przy dowolnym poziomie współbieżności, jednak aktor może przetwarzać tylko jedną wiadomość na raz. Alternatywnym rozwiązaniem jest zaparkowanie wątku, jeśli musisz poczekać na wynik, chyba że zaczniesz używać kontraktów futures, ale w przypadkach, w których nie musisz się martwić o asynchroniczne przesyłanie wiadomości lub skalowanie, wydaje się, że zatrudnienie aktora może być przesadą.
Więc moje pytanie brzmi - czy jest zły czas na wykorzystanie aktorów? Jestem ciekawy, jak wygląda Erlang i naprawdę chciałbym wglądu innych ludzi. Lub jeśli istnieją jakieś zasady dotyczące korzystania z aktora.
źródło
ask
wcieleniem się w rolę aktora a zwykłym użyciem równinyFuture
.Odpowiedzi:
To pytanie mnie interesuje i prowadziłem badania. Aby zobaczyć inne punkty widzenia, zobacz ten post na blogu autorstwa Noela Walsha lub to pytanie dotyczące przepełnienia stosu. Mam kilka opinii, które chciałbym przedstawić:
Podobnie jak Jason, chętnie słyszę wgląd innych ludzi tutaj. Jak mogę rozwiązać niektóre z powyższych problemów i lepiej korzystać z Akka?
źródło
Warto zastanowić się, do czego służy model aktora: taki jest model aktora
Jest to cenne, ponieważ korzystanie ze stanu wspólnego z wielu wątków staje się naprawdę trudne, szczególnie gdy istnieją relacje między różnymi składnikami stanu wspólnego, które muszą być zsynchronizowane. Jeśli jednak masz składniki domeny, w których:
wtedy model aktora nie zapewni wielu (jeśli w ogóle) korzyści.
Mam nadzieję, że to pomaga.
źródło
Twoja intuicja jest prawidłowa, IMHO. Używanie aktorów wszędzie jest jak przysłowiowy młotek i widzenie tylko gwoździ.
Najlepszą praktyką Erlang jest stosowanie procesów / aktorów do wszystkich działań, które odbywają się jednocześnie. To jest tak jak w prawdziwym życiu. Czasami trudno jest znaleźć właściwą ziarnistość, ale w większości przypadków po prostu wiesz, patrząc na modelowaną domenę i zachowując zdrowy rozsądek. Obawiam się, że nie mam lepszej metody, ale mam nadzieję, że to pomoże.
źródło
W celu przesyłania komunikatów wejścia / wyjścia:
Niedawno spotkałem się z aplikacją opartą na akce, w której model aktora faktycznie powodował problemy z współbieżnością, prostszy model byłby lepszy przy obciążeniu.
Problem polegał na tym, że przychodzące wiadomości poruszały się po różnych „liniach” (różnymi ścieżkami aktorów), ale kod zakładał, że wiadomości dotrą do miejsca docelowego w tej samej kolejności, w jakiej przybyły. Tak długo, jak dane przychodziły w odpowiednio dużych odstępach czasu, działało to, ponieważ do miejsca docelowego byłby tylko jeden konflikt. Kiedy interwały zmniejszały się, zaczęli schodzić z porządku i powodować dziwne zachowania.
Problem mógł zostać rozwiązany poprawnie przy nieco mniejszej liczbie aktorów, ale łatwo jest popełnić błąd, gdy nadużywają ich.
źródło
Moim zdaniem istnieją dwa przypadki użycia aktorów. Zasoby współdzielone, takie jak porty i tym podobne, oraz stan duży. Pierwsza była dobrze omówiona do tej pory w dyskusji, ale ważny jest również duży stan.
Duża struktura przekazywana przy każdym wywołaniu procedury może zużywać dużo stosów. Ten stan można umieścić w osobnym procesie, strukturę zastąpić identyfikatorem procesu, a proces ten jest sprawdzany w razie potrzeby.
Bazy danych, takie jak mnesia, można traktować jako zewnętrzne zapisywanie stanu w procesie zapytania.
źródło