W jaki sposób system zdarzeń Node.js różni się od wzorca aktora Akka?

94

Pracowałem Node.jsprzez jakiś czas i uważam się za całkiem niezłego z Javą. Ale właśnie odkryłem Akkai od razu zainteresowałem się jego wzorem aktorskim (z tego, co rozumiem).

Teraz, zakładając, że moje umiejętności w zakresie JavaScript były na równi z moimi umiejętnościami Scala / Java, chcę skupić się na praktyczności obu systemów. Zwłaszcza jeśli chodzi o usługi internetowe.

Rozumiem, że Node doskonale radzi sobie z wieloma równoległymi operacjami. Wyobrażam sobie, że dobra usługa sieciowa Node dla systemu zarządzania zasobami byłaby doskonała w obsłudze wielu użytkowników wprowadzających zmiany w tym samym czasie (w aplikacji o dużym natężeniu ruchu).

Ale po przeczytaniu o aktorach w Akce wydaje się, że byłby świetny w tym samym. Podoba mi się pomysł ograniczenia pracy do kawałków wielkości kęsa. Poza tym lata temu parałem się Erlangiem i zakochałem się w używanym przez niego systemie przekazywania wiadomości.

Pracuję nad wieloma aplikacjami, które zajmują się złożoną logiką biznesową i myślę, że nadszedł czas, aby wskoczyć w jedną lub drugą. Szczególnie uaktualnianie starszych aplikacji Struts i C #.

W każdym razie, unikając świętych wojen, w jaki sposób te dwa systemy zasadniczo się różnią? Wygląda na to, że oba są nastawione na ten sam cel. Być może architektura „samonaprawiania” Akki ma przewagę.

EDYTOWAĆ

Wygląda na to, że głosuję blisko. Proszę nie traktuj tego pytania jako „co jest lepsze, węzeł czy akka?”. To, czego szukam, to fundamentalne różnice w bibliotekach sterowanych zdarzeniami, takich jak Node, i bibliotekach opartych na aktorach, takich jak Akka.

cbmeeks
źródło
12
Głosowałem na Ciebie, aby powiedzieć „odejdź” wszystkim bliskim wyborcom :)
Nerrve
@cbmeeks czy mogę zapytać, co wybrałeś i jak ci idzie z twoim wyborem?
Jas

Odpowiedzi:

66

Bez wchodzenia w szczegóły (o których wiem zbyt mało w przypadku Node.js), główna różnica polega na tym, że Node.js obsługuje tylko współbieżność bez równoległości, podczas gdy Akka obsługuje oba. Oba systemy są całkowicie sterowane zdarzeniami i mogą być skalowane do dużych obciążeń roboczych, ale brak równoległości utrudnia w Node.js (tj. Równoległość jest jawnie kodowana przez uruchamianie wielu węzłów i odpowiednio wysyłanie żądań; dlatego jest nieelastyczna w czasie wykonywania) , podczas gdy w Akce jest to dość łatwe ze względu na przestrajalne, wielowątkowe executory. Biorąc pod uwagę małe, odizolowane jednostki pracy (wywołania aktorów), Akka automatycznie zrównoleglenie wykonania dla Ciebie.

Inną ważną różnicą jest to, że Akka zawiera system do obsługi awarii w ustrukturyzowany sposób (poprzez nadzorowanie każdego aktora przez swojego rodzica, co jest obowiązkowe), podczas gdy Node.js opiera się na konwencjach dla autorów, aby przekazywać warunki błędu z wywołania zwrotnego do wywołania zwrotnego. Podstawowy problem polega na tym, że systemy asynchroniczne nie mogą stosować standardowego podejścia do wyjątków stosowanych przez synchroniczne systemy oparte na stosie, ponieważ kod „wywołujący” przeniósł się do innych zadań do czasu wystąpienia błędu wywołania zwrotnego. Wbudowana obsługa błędów w systemie zwiększa prawdopodobieństwo, że aplikacje zbudowane w tym systemie są niezawodne.

Powyższe nie ma być wyczerpujące, jestem pewien, że różnic jest o wiele więcej.

Roland Kuhn
źródło
2
Czy uważasz, że najlepszym sposobem korzystania z PLAY-FRAMEWORK lub SPRAY jest użycie AKKA do zbudowania spokojnej aplikacji internetowej?
sesja
4
Tak, oba są dobrym wyborem. Play nadaje się jako platforma zapewniająca w pełni zintegrowane środowisko programistyczne, ale oznacza to, że Play będzie uruchamiać Twoją aplikację. Spray jest lepszy, jeśli chcesz po prostu mieć cienką warstwę REST osadzoną w aplikacji Akka. Należy pamiętać, że Spray stanie się akka-http w najbliższych miesiącach.
Roland Kuhn
3
A także, aby zwrócić uwagę, otrzymujesz całą dobroć języka statycznego ze Scala / Java i bez piekła zwrotnego w javascript. Java / Scala byłaby łatwiejsza do debugowania niż javascript.
Chirdeep Tomar
2
Jeśli chodzi o równoległość z węzłem, należy wspomnieć, że można rozwidlać procesy w czasie wykonywania za pomocą jego podstawowego interfejsu API klastra . Zrobi to, co masz na myśli mówiąc o aktorach równoległych.
kernel
2
Wydaje mi się, że ta odpowiedź z 2012 roku jest teraz bardzo przestarzała, ponieważ wiele rzeczy zmieniło się, szczególnie w przypadku Node od ich czasu. Spójrz na npmjs.com/package/webworker-threads web workers w Node, możesz przenieść blokowanie intensywnej pracy do równoległego procesu (wszystko w tym samym procesie Node).
Mark Pieszak - Trilon.io
8

Nie używałem jeszcze Akki, ale wygląda na to, że jest podobny do erlang, ale w Javie. W erlangu wszystkie procesy są jak aktorzy w Akce, mają skrzynki pocztowe, możesz przesyłać wiadomości między nimi, masz przełożonych itp.

Node.js używa współbieżnej współbieżności. Oznacza to, że masz współbieżność, gdy na to zezwalasz (na przykład podczas wywoływania operacji io lub jakiegoś zdarzenia asynchronicznego). Kiedy masz długą operację (obliczanie czegoś w długiej pętli), cały system blokuje się.

Erlang stosuje zapobiegawcze przełączanie zadań. Gdy masz długą pętlę, system może ją wstrzymać, aby uruchomić inną operację i kontynuować po pewnym czasie. W przypadku ogromnej współbieżności Node.js jest dobry, jeśli wykonujesz tylko krótkie operacje. Oba obsługują miliony klientów: http://blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/ http://blog.whatsapp.com/index.php/2012/01/ 1 milion to tyle 2011 /

W javie potrzebujesz wątków, aby wykonywać dowolną współbieżność, w przeciwnym razie nie możesz wstrzymać wykonywania wewnątrz funkcji, co robi erlang (w rzeczywistości erlang pauzuje między wywołaniami funkcji, ale dzieje się tak ze wszystkimi funkcjami). Możesz wstrzymać wykonywanie między wiadomościami.

yetihehe
źródło
OK, zakładając, że muszę rejestrować pliki dziennika z wielu różnych źródeł. Za każdym razem, gdy aplikacja generuje wpis dziennika, muszę również wysłać ten wpis do innej aplikacji w celu nagrania. Zakładam, że może to być długotrwały proces, ponieważ aplikacja może mieć przekroczenia limitów czasu bazy danych, awarie protokołu HTTP itp. W tym przykładzie zawieszenie zapisu w bazie danych spowoduje zawieszenie całego systemu Node? Czy AKKA miałby ten sam problem, czy po prostu nie dostaję korelacji?
cbmeeks
1
Żadne z nich nie ucierpi, ponieważ dostęp do bazy danych jest zwykle implementowany asynchronicznie w takich przypadkach. Ale jeśli w jakiś sposób uda ci się zmusić do tego bibliotekę synchroniczną, oboje zawiesiliby się.
yetihehe
Dzięki. Bardzo staram się nie zamieniać tego w node vs akkadebatę, ale mam prawdziwy problem, który muszę rozwiązać. Powiedziałbym, że moje umiejętności Java / JavaScript są dość bliskie, ale mam bardzo małe doświadczenie z Node i żadne z AKKA (lub Scala). Ale mam kilka aplikacji (na razie wewnętrznych, ale później zewnętrznych) i ludzie szukają sposobów na przeszukiwanie tych ogromnych dzienników. Nie można korzystać z opcji innych firm ze względu na problemy z prywatnością. Wygląda na to, że któryś z nich poradziłby sobie z pracą. Ale podoba mi się przekazywanie wiadomości AKKA, więc mogę to zbadać. Plus Java jest tutaj bardziej popychana niż JS. Dzięki.
cbmeeks
Jeśli potrzebujesz przeszukiwać ogromne dzienniki, spróbuj przejrzeć logstash lub graylog2.
Toddius Zho
6

Nie jestem pewien, czy to uczciwe porównanie do rysowania. Czytam to bardziej jako „jak wypada porównanie systemu opartego na zdarzeniach z modelem aktora?”. Nodejs może wspierać model aktora, tak jak robi to Scala w Akce, czy C # w Orleanie, w rzeczywistości sprawdź nactor , ktoś wydaje się już tego próbować.

Jeśli chodzi o porównanie systemu zdarzeniowego z modelem aktora, pozwoliłbym opisać to mądrzejszym ludziom. Kilka krótkich uwag dotyczących modelu aktora:

  • Model aktora jest oparty na przekazie
  • Modele aktorów zwykle dobrze sobie radzą w systemach rozproszonych (klastrach). Oczywiście systemy oparte na zdarzeniach mogą być dystrybuowane, ale myślę, że model aktora ma wbudowaną dystrybucję w odniesieniu do dystrybucji obliczeń. Nowe żądanie może zostać skierowane do nowego aktora w innym silosie, który nie jest pewien, jak to zadziała w przypadku zdarzenia.
  • Model aktora wspiera niepowodzenie w tym, że jeśli hej, klaster 1 zostanie wyłączony, obserwator może ogólnie znaleźć inny silos do wykonania pracy

Zobacz też dramat . Jest to kolejna implementacja modelu aktora nodejs.

stevebot
źródło
1
spróbuj skonfigurować klaster za pomocą nodejs, potrzebujesz dockera, kubernetees i spreparuj system rozproszony. Spróbuj także ustawić użycie 1 więcej rdzenia w nodejs. Akka, to jest przeznaczone do radzenia sobie z nimi. również dojrzałość samego nodejs, bezpieczeństwo i sposób kodowania, który wymaga innego frameworka do zrobienia czegoś, jest kwestią, która sama nodejs nie może być używana w dużym systemie rozproszonym, ale przynajmniej w stylu MSA. W każdym razie moja opinia.
Raffaello