Node.js lub Erlang

86

Bardzo podoba mi się te narzędzia, jeśli chodzi o poziom współbieżności, z jakim mogą sobie poradzić.

Erlang / OTP wygląda na znacznie bardziej stabilne rozwiązanie, ale wymaga dużo więcej nauki i dużo nurkowania w funkcjonalnym paradygmacie języka. I wygląda na to, że Erlang / OTP znacznie poprawia to, jeśli chodzi o wielordzeniowe procesory (popraw mnie, jeśli się mylę).

Ale co mam wybrać? Który z nich jest lepszy w perspektywie krótko- i długoterminowej?

Moim celem jest nauczenie się narzędzia, które ułatwi skalowanie moich projektów internetowych pod dużym obciążeniem niż tradycyjne języki.

user80805
źródło
Możesz używać JavaScript jako języka funkcjonalnego z underscorejs.org
Todd Moses
2
@ToddMoses czy na pewno skomentowałeś właściwe pytanie?
Flavien Volken
Jabłka i Pomarańcze. Node.JS (w swej istocie) to libevent (C) + współpraca z Javascriptem. Erlang to całkowicie niestandardowa implementacja IO. Node.JS jest przeznaczony dla aplikacji jednowątkowych. Twoja delema polega na tym, czy chcesz pracować na Facebooku / Google, czy też chcesz tworzyć oprogramowanie kickass.
Vans S

Odpowiedzi:

87

Spróbowałbym Erlangowi. Nawet jeśli będzie to bardziej stroma krzywa uczenia się, wyciągniesz z niej więcej, ponieważ będziesz uczyć się funkcjonalnego języka programowania. Ponadto, ponieważ Erlang jest specjalnie zaprojektowany do tworzenia niezawodnych, wysoce współbieżnych systemów, dowiesz się wiele o tworzeniu wysoce skalowalnych usług w tym samym czasie.

Justin Ethier
źródło
10
Nie sądzę, że Erlang jest nieco bardziej złożony niż JavaScript. W Erlangu nie ma żadnego rodzaju dziedziczenia, więc zawsze masz pewność, jaką funkcję wywołujesz. W Erlang nie ma niejawnej konwersji typów, więc zawsze masz pewność, jakich typów danych używasz. Nie ma destrukcyjnego przypisania, więc zawsze masz pewność, że jakiś stary fragment kodu nie zostanie uszkodzony, ponieważ jakiś nowy kod w wywołaniu zwrotnym zmienił twój stan wewnętrzny.
Dmitry Belyaev
51

Nie mogę mówić w imieniu Erlanga, ale kilka rzeczy, o których nie wspomniano o node:

  • Node korzysta z silnika V8 Google, aby faktycznie kompilować javascript do kodu maszynowego. Więc node jest właściwie dość szybki. Jest to więc dodatek do korzyści związanych z szybkością oferowaną przez programowanie sterowane zdarzeniami i nieblokujące io.
  • Node ma dość aktywną społeczność. Wskocz do ich grupy IRC na freenode, a zobaczysz, co mam na myśli
  • Zauważyłem, że powyższe komentarze zmuszają Erlanga do przekonania, że ​​przyda się nauka funkcjonalnego języka programowania. Chociaż zgadzam się, że ważne jest, aby rozwinąć swój zestaw umiejętności i zdobyć jedną z nich, nie powinieneś opierać projektu na fakcie, że chcesz nauczyć się nowego stylu programowania
  • Z drugiej strony, Javascript jest już w paradygmacie, w którym możesz swobodnie pisać! Dodatkowo jest to javascript, więc kiedy piszesz kod po stronie klienta, będzie wyglądał i działał spójnie.
  • Społeczność node już wypompowała mnóstwo modułów ! Istnieją moduły dla redis, mongodb, couch i co masz. Kolejnym dobrym modułem do obejrzenia jest Express (pomyśl o Sinatrze dla węzła)

Obejrzyj wideo na blogu Yahoo autorstwa Ryana Dahla, gościa, który napisał Node. Myślę, że pomoże ci to lepiej zrozumieć, gdzie jest węzeł i dokąd zmierza.

Należy pamiętać, że węzeł wciąż jest na późnym etapie rozwoju, a więc przeszedł kilka zmian - zmian, które zepsuły wcześniejszy kod. Jednak podobno jest to punkt, w którym można oczekiwać, że interfejs API nie zmieni się zbytnio. Więc jeśli szukasz czegoś fajnego, powiedziałbym, że node to świetny wybór.

Jarsen
źródło
26
Myślę, że silnik V8 kompiluje JavaScript do kodu maszynowego, a nie do asemblacji.
Jonas,
10
Tak dużo pracy z Javascriptem nie sprawia, że ​​język jest nawet trochę odpowiedni do rozwiązywania złożonych problemów. Sam język jest okropny z tymi wszystkimi specjalnymi przypadkami konwersji typów. I styl wywołania zwrotnego, w którym zmienne są zmieniane w setkach różnych miejsc i do diabła z szukaniem miejsca, w którym miało miejsce jakieś zadanie.
Dmitry Belyaev
15

Jestem wieloletnim programistą Erlang i to pytanie skłoniło mnie do przyjrzenia się node.js. Wygląda cholernie dobrze.

Wygląda na to, że aby skorzystać z wielu rdzeni, musisz uruchomić wiele procesów. Nie widzę jednak nic o ustawianiu koligacji procesora. Możesz użyć zestawu zadań na Linuksie, ale prawdopodobnie powinien być sparametryzowany i ustawiony w programie.

Zauważyłem też, że obsługa platformy może być trochę słabsza. W szczególności wygląda na to, że musisz działać pod obsługą Cygwin dla Windows.

Wygląda jednak dobrze.


Edytować

Node.js ma teraz natywną obsługę systemu Windows.

dsmith
źródło
5
Ta odpowiedź jest trochę stara. W tej chwili Node jest wieloplatformowy, nie ma potrzeby posiadania Cygwin dla Windows. Node ma wbudowaną obsługę klastrowania w jednym komputerze, współużytkując gniazda TCP.
Farid Nouri Neshat
9

Patrzę na te same dwie alternatywy dla wielu projektów.

Jak dotąd najlepszą brzytwą, jaką wymyśliłem, aby zdecydować między nimi dla danego projektu, jest to, czy muszę używać Javascript. Jeden istniejący system, który chcę migrować, jest już napisany w Javascript, więc jego następna wersja prawdopodobnie zostanie wykonana w node.js. Inne projekty będą wykonywane w niektórych frameworkach internetowych Erlang, ponieważ nie ma istniejącej bazy kodu do migracji.

Inną kwestią jest to, że Erlang skaluje się znacznie poza wiele rdzeni, może być skalowany do całego centrum danych. Nie widzę wbudowanego mechanizmu w node.js, który pozwala mi wysłać komunikat innemu procesowi JS bez dbania o to, na której maszynie jest on, ale jest on wbudowany bezpośrednio w Erlang na najniższych poziomach. Jeśli Twój problem nie jest wystarczająco duży, aby potrzebować wielu maszyn lub jeśli nie wymaga wielu współpracujących procesów, ta zaleta prawdopodobnie nie będzie miała znaczenia, więc powinieneś ją zignorować.

Erlang to rzeczywiście głęboki basen do nurkowania. Sugerowałbym napisanie samodzielnego programu funkcjonalnego, zanim zaczniesz tworzyć aplikacje internetowe. Jeszcze łatwiejszym pierwszym krokiem, ponieważ wydaje się, że dobrze radzisz sobie z Javascriptem, jest wypróbowanie programowania JS w bardziej funkcjonalnym stylu. Jeśli używasz jQuery lub Prototype, już rozpocząłeś tę ścieżkę. Spróbuj przejść pomiędzy czystym programowaniem funkcyjnym w Erlangu lub jednym z jego krewnych (Haskell, F #, Scala ...) a funkcjonalnym JS.

Gdy już zaznajomisz się z programowaniem funkcjonalnym, poszukaj jednego z wielu frameworków internetowych Erlang; prawdopodobnie nie powinieneś pisać aplikacji bezpośrednio na coś niskiego poziomu, jak inetsna tak późnym etapie. Spójrz na przykład na azot .

Warren Young
źródło
Często nie wspomina się, że punkt „Erlang skaluje się do całego centrum danych” ma kilka bardzo ważnych kwestii do rozważenia (bezpieczeństwo jest duże). Zapoznaj się z rozdziałem na ten temat tutaj: learnyousomeerlang.com/distribunomicon
jocull
9

Chociaż osobiście wybrałbym Erlanga, przyznaję, że jestem trochę stronniczy w stosunku do JavaScript. Moja rada jest taka, aby ocenić kilka punktów:

  1. Czy ponownie wykorzystujesz istniejący kod w jednym z tych języków (zarówno pod względem kodu źródłowego, jak i doświadczenia programisty!)
  2. Czy potrzebujesz / chcesz aktualizacje w locie bez zatrzymywania aplikacji (tutaj Erlang wygrywa domyślnie - jego środowisko uruchomieniowe zostało zaprojektowane dla tego przypadku, a OTP zawiera wszystkie niezbędne narzędzia)
  3. Jak duży jest oczekiwany ruch w zakresie oddzielnych, współbieżnych operacji, a nie przepustowości?
  4. Jak „równoległe” są operacje, które wykonujesz dla każdego żądania?

Erlang ma naprawdę dopracowany system współbieżności i równoległy, przejrzysty dla sieci. W zależności od tego, jaki dokładnie jest projekt, dostępność dojrzałej implementacji takiego systemu może przeważyć wszelkie problemy związane z nauką nowego języka. Istnieją również dwa inne języki, które działają na Erlang VM, których możesz używać, Reia w stylu Ruby / Python i Erlang o smaku Lisp .

Jeszcze inną opcją jest użycie obu, zwłaszcza gdy Erlang jest używany jako swego rodzaju „hub”. Nie jestem pewien, czy Node.js ma system interfejsu funkcji obcych, ale jeśli tak, Erlang ma bibliotekę C dla procesów zewnętrznych, które mogą współpracować z systemem, tak jak każdy inny proces Erlang.

p_l
źródło
Zgodnie z dokumentacją Node.js może wykorzystywać C i C ++ do zewnętrznych dodatków. nodejs.org/docs/v0.3.1/api/addons.html
Evan Plaice,
Wygląda na to, że Reia umarła, ale na jej miejscu jest eliksir … przypomina mi Groovy i Javę; tutaj byłby to Elixir i Erlang.
stommepoes
@EvanPlaice - To nie robi na mnie większego wrażenia. Chodzi o to, że w zasadzie kodujesz problematyczną rzecz w C ++ i dodajesz je jako wbudowane. Niewiele z FFI polega na rozszerzaniu emulatora. (Okej, osobiste preferencje;)) Wspomniana zewnętrzna biblioteka w przypadku erlanga polega na tworzeniu procesów asynchronicznych w innych językach, które pojawiają się jako węzły LUB rozmawiają przez otwarty port (pomyśl dwukierunkowy potok z danymi strukturalnymi). Wszystko to ładnie pasuje do asynchronicznego trybu pracy. Istnieją również NIF, które są zasadniczo tym, co ma Node.js, ale są odradzane.
p_l
1
@p_l Z tego, co rozumiem, podejście do węzłów jest nieco inne. Chociaż węzeł jest bardzo dobry w obsłudze asynchronicznych wywołań we / wy (tj. Żądań sieci Web), działa w środowisku jednowątkowym. Jest więc świetny w wysyłaniu, ale nie tak dobry w przetwarzaniu intensywnie wykorzystującym procesor. Aby pokryć ten problem, możesz rozwidlić inny proces / wątek, który uruchamia natywny kod C / C ++. Jeśli wszystko, co robisz, to asynchroniczne wywołania IO (np. IPC | potoki dwukierunkowe), to node.js powinien być w stanie obsłużyć obciążenie. O ile nie jest zakodowane, aby spędzać dużo czasu czekając na połączenia synchroniczne.
Evan Plaice
5

Wygląda na to, że Erlang działa lepiej przy wdrażaniu na stosunkowo niskim serwerze (512 MB 4-rdzeniowej maszyny wirtualnej 2,4 GHz AMD). Wynika to z doświadczenia firmy SyncPad w zakresie porównywania implementacji Erlang i Node.js ich aplikacji serwera wirtualnej tablicy.

adib
źródło
2
Tak, node.js wydaje się mieć nieprzyjemny problem z wyciekiem pamięci. Węzeł jest raczej nowy i eksperymentalny i ani JavaScript, ani silnik V8 nie zostały zaprojektowane dla takich scenariuszy serwerowych. Z drugiej strony Erlang został zaprojektowany właśnie do tego od podstaw i miał wiele lat, aby dopracować się i dojrzeć.
Rolf
2
Ten link wydaje się martwy, ale tutaj jest w WayBackMachine web.archive.org/web/20120902014555/http://blog.mysyncpad.com/…
żartobliwie
4

Na tej samej maszynie wirtualnej jest jeszcze jeden język, którym jest erlang -> Elixir

To bardzo interesująca alternatywa dla Erlanga, sprawdź tę.

Posiada również szybko rozwijający się framework sieciowy oparty na nim-> Phoenix Framework

NoDisplayName
źródło
0

Wolę Erlanga od Node. Jeśli chcesz współbieżności, Node można zastąpić Erlang lub Golang ze względu na ich lekkie procesy.

Erlang nie jest łatwy do nauczenia, więc wymaga dużo wysiłku, ale jego społeczność jest aktywna, więc może uzyskać pomoc, to tylko powód, dla którego ludzie wolą Node.

Sumit Pugalia
źródło