Node.js oder Erlang

86

Ich mag diese Tools wirklich, wenn es um die Parallelität geht, mit der sie umgehen können.

Erlang scheint eine viel stabilere Lösung zu sein, erfordert jedoch viel mehr Lernen und viel Eintauchen in das Paradigma der funktionalen Sprache. Und es sieht so aus, als ob Erlang es viel besser macht, wenn es um CPUs mit mehreren Kernen geht (reparieren Sie mich, wenn ich falsch liege).

Aber welches soll ich wählen? Welches ist kurz- / langfristig besser?

Mein Ziel ist es, ein Tool zu erlernen, mit dem sich meine Webprojekte unter hoher Last einfacher skalieren lassen als mit herkömmlichen Sprachen.

user80805
quelle
Sie können JavaScript als funktionale Sprache mit underscorejs.org
Todd Moses
2
@ToddMoses Bist du sicher, dass du die richtige Frage kommentiert hast?
Flavien Volken
Äpfel und Orangen. Node.JS (im Kern) ist libevent (C) + Javascript interop. Erlang ist eine vollständig benutzerdefinierte E / A-Implementierung. Node.JS wurde für Single-Threaded-Apps entwickelt. Ihr Delema ist, ob Sie einen Job bei Facebook / Google oder eine Kickass-Software erstellen möchten.
Vans S

Antworten:

86

Ich würde Erlang ausprobieren. Obwohl es eine steilere Lernkurve sein wird, werden Sie mehr daraus machen, da Sie eine funktionale Programmiersprache lernen werden. Da Erlang speziell für die Erstellung zuverlässiger, gleichzeitig ablaufender Systeme entwickelt wurde, lernen Sie gleichzeitig viel über die Erstellung hoch skalierbarer Dienste.

Justin Ethier
quelle
10
Ich denke nicht, dass Erlang etwas komplexer ist als Javascript. In Erlang gibt es keine Vererbung, sodass Sie immer sicher sind, welche Funktion Sie aufrufen. In Erlang gibt es keine implizite Typkonvertierung, sodass Sie immer sicher sind, welche Datentypen Sie verwenden. Es gibt keine destruktive Zuweisung, sodass Sie immer sicher sind, dass kein alter Code beschädigt wird, da ein neuer Code im Rückruf Ihren internen Status geändert hat.
Dmitry Belyaev
50

Ich kann nicht für Erlang sprechen, aber ein paar Dinge, die über Node nicht erwähnt wurden:

  • Node verwendet die V8-Engine von Google, um Javascript tatsächlich in Maschinencode zu kompilieren. Der Knoten ist also eigentlich ziemlich schnell. Dies kommt zu den Geschwindigkeitsvorteilen hinzu, die ereignisgesteuerte Programmierung und nicht blockierende Io bieten.
  • Node hat eine ziemlich aktive Community. Hüpfen Sie auf ihre IRC-Gruppe auf freenode und Sie werden sehen, was ich meine
  • Ich habe bemerkt, dass die obigen Kommentare Erlang auf der Grundlage drücken, dass es nützlich sein wird, eine funktionierende Programmiersprache zu lernen. Ich stimme zu, dass es wichtig ist, Ihre Fähigkeiten zu erweitern und eine davon in den Griff zu bekommen, aber Sie sollten ein Projekt nicht auf die Tatsache stützen, dass Sie einen neuen Programmierstil erlernen möchten
  • Auf der anderen Seite befindet sich Javascript bereits in einem Paradigma, in das Sie gerne schreiben! Außerdem ist es Javascript. Wenn Sie also clientseitigen Code schreiben, sieht es konsistent aus und fühlt sich auch so an.
  • Die Community des Knotens hat bereits Tonnen von Modulen abgepumpt ! Es gibt Module für Redis, Mongodb, Couch und was hast du? Ein weiteres gutes Modul ist Express (denken Sie an Sinatra als Knoten).

Schauen Sie sich das Video auf Yahoo Blog von Ryan Dahl an, dem Typ, der tatsächlich Node geschrieben hat. Ich denke, das wird Ihnen helfen, eine bessere Vorstellung davon zu bekommen, wo sich der Knoten befindet und wohin er geht.

Beachten Sie, dass sich der Knoten noch in einem späten Entwicklungsstadium befindet und daher einige Änderungen vorgenommen wurden - Änderungen, die früheren Code beschädigt haben. Angeblich ist es jedoch an einem Punkt, an dem Sie erwarten können, dass sich die API nicht zu stark ändert. Wenn Sie also nach etwas suchen, das Spaß macht, würde ich sagen, dass Node eine gute Wahl ist.

Jarsen
quelle
26
Ich denke, die V8-Engine kompiliert JavaScript zu Maschinencode und nicht zu Assembly.
Jonas
10
Wenn so viel mit Javascript gearbeitet wird, eignet sich die Sprache nicht einmal für die Lösung komplexer Probleme. Die Sprache selbst ist schrecklich mit all diesen Sonderfällen bei der Typenkonvertierung. Und Rückrufstil, bei dem Variablen an Hunderten von verschiedenen Orten geändert werden, und zum Teufel mit der Suche nach dem Ort, an dem eine Zuordnung stattgefunden hat.
Dmitry Belyaev
15

Ich bin ein langjähriger Erlang-Programmierer, und diese Frage veranlasste mich, einen Blick auf node.js zu werfen. Es sieht verdammt gut aus.

Es scheint, dass Sie mehrere Prozesse erzeugen müssen, um mehrere Kerne nutzen zu können. Ich kann jedoch nichts über das Einstellen der Prozessoraffinität sehen. Sie könnten das Task-Set unter Linux verwenden, aber es sollte wahrscheinlich parametrisiert und im Programm festgelegt werden.

Mir ist auch aufgefallen, dass die Plattformunterstützung möglicherweise etwas schwächer ist. Insbesondere sieht es so aus, als müssten Sie unter Cygwin für Windows-Unterstützung ausgeführt werden.

Sieht aber gut aus.


Bearbeiten

Node.js bietet jetzt native Unterstützung für Windows.

Schmied
quelle
5
Diese Antwort ist ein bisschen alt. Derzeit ist Node plattformübergreifend, Cygwin für Windows ist nicht erforderlich. Und Node bietet integrierte Unterstützung für das Clustering auf einem Computer, wobei die TCP-Sockets gemeinsam genutzt werden.
Farid Nouri Neshat
9

Ich schaue mir die gleichen zwei Alternativen an, die Sie für mehrere Projekte sind.

Bisher ist das beste Rasiermesser, mit dem ich mich für ein bestimmtes Projekt zwischen ihnen entschieden habe, ob ich Javascript verwenden muss. Ein vorhandenes System, das ich migrieren möchte, ist bereits in Javascript geschrieben, daher wird die nächste Version wahrscheinlich in node.js ausgeführt. Andere Projekte werden in einigen Erlang-Webframeworks durchgeführt, da keine zu migrierende Codebasis vorhanden ist.

Eine weitere Überlegung ist, dass Erlang weit über mehrere Kerne hinaus skaliert und auf ein ganzes Rechenzentrum skaliert werden kann. Ich sehe keinen integrierten Mechanismus in node.js, mit dem ich einem anderen JS-Prozess eine Nachricht senden kann, ohne sich darum zu kümmern, auf welchem ​​Computer er sich befindet, aber dieser ist auf den niedrigsten Ebenen direkt in Erlang integriert. Wenn Ihr Problem nicht groß genug ist, um mehrere Computer zu benötigen, oder wenn nicht mehrere kooperierende Prozesse erforderlich sind, spielt dieser Vorteil wahrscheinlich keine Rolle. Sie sollten ihn daher ignorieren.

Erlang ist in der Tat ein tiefer Pool, in den man eintauchen kann. Ich würde empfehlen, zuerst ein eigenständiges Funktionsprogramm zu schreiben, bevor Sie mit dem Erstellen von Web-Apps beginnen. Ein noch einfacherer erster Schritt, da Sie mit Javascript vertraut zu sein scheinen, besteht darin, JS in einem funktionaleren Stil zu programmieren. Wenn Sie jQuery oder Prototype verwenden, haben Sie diesen Pfad bereits eingeschlagen. Versuchen Sie, zwischen reiner funktionaler Programmierung in Erlang oder einem seiner Verwandten (Haskell, F #, Scala ...) und funktionalem JS zu wechseln.

Wenn Sie mit der funktionalen Programmierung vertraut sind, suchen Sie nach einem der vielen Erlang-Webframeworks. Sie sollten Ihre App wahrscheinlich nicht direkt auf etwas Niedriges schreiben, wie inetszu diesem späten Zeitpunkt. Schauen Sie sich zum Beispiel so etwas wie Stickstoff an.

Warren Young
quelle
Es wird oft nicht erwähnt, dass der Punkt "Erlang skaliert auf ein ganzes Rechenzentrum" einige sehr wichtige Punkte enthält (Sicherheit ist ein großer Punkt). Schauen Sie sich das Kapitel dazu hier an: learnyousomeerlang.com/distribunomicon
jocull
9

Während ich mich persönlich für Erlang entscheiden würde, gebe ich zu, dass ich ein wenig voreingenommen gegenüber JavaScript bin. Mein Rat ist, dass Sie einige Punkte bewerten:

  1. Verwenden Sie vorhandenen Code in einer dieser Sprachen wieder (sowohl in Bezug auf den Quellcode als auch in Bezug auf die Programmiererfahrung!)?
  2. Benötigen / möchten Sie On-the-Fly-Updates, ohne die Anwendung zu stoppen? (Hier gewinnt Erlang standardmäßig - die Laufzeit wurde für diesen Fall entwickelt, und OTP enthält alle erforderlichen Tools.)
  3. Wie groß ist der erwartete Datenverkehr in Bezug auf separate, gleichzeitige Vorgänge und nicht auf die Bandbreite?
  4. Wie "parallel" sind die Vorgänge, die Sie für jede Anforderung ausführen?

Erlang hat das parallel verteilte System für Parallelität und netzwerktransparente Systeme wirklich optimiert. Je nachdem, was genau das Projekt ist, kann die Verfügbarkeit einer ausgereiften Implementierung eines solchen Systems die Probleme beim Erlernen einer neuen Sprache überwiegen. Es gibt auch zwei andere Sprachen, die auf Erlang VM funktionieren, die Sie verwenden können: Ruby / Python-ähnliche Reia und Lisp-Flavored Erlang .

Eine weitere Option ist die Verwendung von beiden, insbesondere wenn Erlang als eine Art "Hub" verwendet wird. Ich bin mir nicht sicher, ob Node.js ein Fremdfunktionsschnittstellensystem hat, aber wenn ja, hat Erlang eine C-Bibliothek, damit externe Prozesse wie jeder andere Erlang-Prozess mit dem System verbunden werden können.

p_l
quelle
Laut den Dokumenten kann Node.js C und C ++ für externe Addons nutzen. nodejs.org/docs/v0.3.1/api/addons.html
Evan Plaice
Sieht aus wie Reia gestorben ist, aber an seiner Stelle ist Elixier ... es erinnert mich an Groovy und Java; hier wären es Elixier und Erlang.
Stommepoes
@EvanPlaice - Das beeindruckt mich nicht sehr. Die Sache ist, dass Sie im Grunde eine problematische Sache in C ++ codieren und sie als integrierte Funktionen hinzufügen. Nicht viel von einem FFI ist das, was Sie tatsächlich tun, um den Emulator zu erweitern. (Okay, persönliche Präferenz;)) Die erwähnte externe Bibliothek in Erlang's Fall besteht darin, asynchrone Prozesse in anderen Sprachen durchzuführen, die als Knoten angezeigt werden ODER über einen offenen Port kommunizieren (denken Sie an eine bidirektionale Pipe mit strukturierten Daten). All das passt gut in den asynchronen Betriebsmodus. Es gibt auch NIFs, was im Wesentlichen das ist, was Node.js hat, aber davon abgeraten wird.
p_l
1
@p_l Soweit ich weiß, unterscheidet sich der Knotenansatz geringfügig. Während Node sehr gut mit asynchronen E / A-Aufrufen (dh Webanforderungen) umgehen kann, wird er in einer Single-Thread-Umgebung ausgeführt. Es ist also großartig beim Versenden, aber nicht so gut bei der CPU-intensiven Verarbeitung. Um diesen Grund abzudecken, können Sie einen anderen Prozess / Thread abschneiden, auf dem nativer C / C ++ - Code ausgeführt wird. Wenn Sie nur asynchrone E / A-Aufrufe (z. B. IPC | bidirektionale Pipes) ausführen, sollte node.js in der Lage sein, die Last zu verarbeiten. Solange es nicht codiert ist, um viel Zeit auf synchrone Anrufe zu warten.
Evan Plaice
5

Es sieht so aus, als ob Erlang für die Bereitstellung auf einem relativ Low-End-Server (512 MB 4-Core-AMD-VM mit 2,4 GHz) eine bessere Leistung erbringt. Dies ist auf die Erfahrung von SyncPad beim Vergleich von Erlang- und Node.j- Implementierungen ihrer virtuellen Whiteboard-Serveranwendung zurückzuführen.

adib
quelle
2
Ja, node.js scheint ein unangenehmes Problem mit Speicherverlusten zu haben. Der Knoten ist ziemlich neu und experimentell und weder JavaScript noch die V8-Engine wurden für solche Serverszenarien entwickelt. Erlang hingegen war von Grund auf genau dafür konzipiert und hatte viele Jahre Zeit, sich zu verfeinern und zu reifen.
Rolf
2
Dieser Link scheint tot zu sein, aber hier ist er auf WayBackMachine web.archive.org/web/20120902014555/http://blog.mysyncpad.com/…
jocull
4

Es gibt eine weitere Sprache auf derselben VM wie erlang -> Elixir

Es ist eine sehr interessante Alternative zu Erlang.

Außerdem verfügt es über ein schnell wachsendes Webframework, das auf it-> Phoenix Framework basiert

NoDisplayName
quelle
0

Ich werde Erlang dem Knoten vorziehen. Wenn Sie Parallelität wünschen, kann Node aufgrund ihrer geringen Prozesse durch Erlang oder Golang ersetzt werden.

Erlang ist nicht leicht zu erlernen, erfordert also viel Aufwand, aber seine Community ist aktiv, sodass sie Hilfe erhalten kann. Dies ist nur der Grund, warum die Leute Node bevorzugen.

Sumit Pugalia
quelle