Node.js o Erlang


86

Mi piacciono molto questi strumenti quando si tratta del livello di concorrenza che può gestire.

Erlang / OTP sembra una soluzione molto più stabile ma richiede molto più apprendimento e molte immersioni nel paradigma del linguaggio funzionale. E sembra che Erlang / OTP lo renda molto meglio quando si tratta di CPU multi-core (correggimi se sbaglio).

Ma quale scegliere? Qual è il migliore nella prospettiva a breve e lungo termine?

Il mio obiettivo è imparare uno strumento che renda la scalabilità dei miei progetti Web sotto carico elevato più facile rispetto ai linguaggi tradizionali.


Puoi utilizzare JavaScript come linguaggio funzionale con underscorejs.org
Todd Moses

2
@ToddMoses sei sicuro di aver commentato la domanda giusta?
Flavien Volken

Mele e Arance. Node.JS (al suo interno) è libevent (C) + Javascript interop. Erlang è un'implementazione IO totalmente personalizzata. Node.JS è fatto per app a thread singolo. Il tuo delema è: vuoi un lavoro in Facebook / Google o vuoi fare un software kickass.
Vans S

Risposte:


87

Darei a Erlang una possibilità. Anche se sarà una curva di apprendimento più ripida, ne otterrai di più poiché imparerai un linguaggio di programmazione funzionale. Inoltre, poiché Erlang è specificamente progettato per creare sistemi affidabili e altamente simultanei, imparerai molto sulla creazione di servizi altamente scalabili allo stesso tempo.


10
Non penso che Erlang sia un po 'più complesso di Javascript. Non esiste alcun tipo di eredità in Erlang, quindi sei sempre sicuro di quale funzione chiami. Non esiste una conversione di tipo implicita in Erlang, quindi sei sempre sicuro di quali tipi di dati utilizzi. Non ci sono assegnazioni distruttive, quindi sei sempre sicuro di non avere un vecchio pezzo di codice rotto perché un nuovo codice in callback ha cambiato il tuo stato interno.
Dmitry Belyaev

51

Non posso parlare per Erlang, ma alcune cose che non sono state menzionate su node:

  • Node utilizza il motore V8 di Google per compilare effettivamente javascript nel codice macchina. Quindi il nodo è in realtà piuttosto veloce. Quindi questo è in cima ai vantaggi in termini di velocità offerti dalla programmazione basata su eventi e io non bloccante.
  • Node ha una comunità piuttosto attiva. Entra nel loro gruppo IRC su freenode e vedrai cosa intendo
  • Ho notato che i commenti sopra spingono Erlang sulla base del fatto che sarà utile imparare un linguaggio di programmazione funzionale. Anche se sono d'accordo che è importante espandere il tuo set di abilità e ottenere uno di quelli sotto la cintura, non dovresti basare un progetto sul fatto che vuoi imparare un nuovo stile di programmazione
  • D'altra parte, Javascript è già in un paradigma in cui ti senti a tuo agio a scrivere! Inoltre è javascript, quindi quando scrivi codice lato client sembrerà coerente.
  • la community di node ha già pompato tonnellate di moduli ! Ci sono moduli per redis, mongodb, couch e cosa hai. Un altro buon modulo da esaminare è Express (pensa a Sinatra per node)

Guarda il video sul blog di yahoo di Ryan Dahl, il ragazzo che ha effettivamente scritto node. Penso che ti aiuterà a darti un'idea migliore di dove si trova il nodo e dove sta andando.

Tieni presente che il nodo è ancora nelle ultime fasi di sviluppo e quindi ha subito parecchi cambiamenti, cambiamenti che hanno rotto il codice precedente. Tuttavia, presumibilmente è a un punto in cui puoi aspettarti che l'API non cambi troppo di più. Quindi, se stai cercando qualcosa di divertente, direi che il nodo è un'ottima scelta.


26
Penso che il motore V8 compili JavaScript in codice macchina e non in assembly.
Jonas

10
Avere così tanto lavoro svolto su Javascript non rende il linguaggio nemmeno un po 'adatto per risolvere problemi complessi. La lingua stessa è orribile con tutti quei casi speciali nella conversione dei tipi. E lo stile di richiamata in cui le variabili vengono modificate in centinaia di luoghi diversi e al diavolo la ricerca del luogo in cui si è verificato un compito.
Dmitry Belyaev

15

Sono un programmatore Erlang di lunga data e questa domanda mi ha spinto a dare un'occhiata a node.js. Sembra dannatamente buono.

Sembra che sia necessario generare più processi per sfruttare più core. Tuttavia, non riesco a vedere nulla sull'impostazione dell'affinità del processore. Potresti usare taskset su Linux, ma probabilmente dovrebbe essere parametrizzato e impostato nel programma.

Ho anche notato che il supporto della piattaforma potrebbe essere un po 'più debole. In particolare, sembra che dovresti eseguire con il supporto Cygwin per Windows.

Sembra buono però.


modificare

Node.js ora ha il supporto nativo per Windows.


5
Questa risposta è un po 'vecchia. Al momento Node è multipiattaforma, non è necessario disporre di Cygwin per Windows. E Node ha il supporto integrato per il clustering in una macchina, condividendo i socket TCP.
Farid Nouri Neshat

9

Sto esaminando le stesse due alternative che sei, Gotts, per più progetti.

Finora, il miglior rasoio che ho escogitato per decidere tra loro per un determinato progetto è se devo usare Javascript. Un sistema esistente che sto cercando di migrare è già scritto in Javascript, quindi è probabile che la sua prossima versione venga eseguita in node.js. Altri progetti verranno eseguiti in alcuni framework Web Erlang perché non esiste una base di codice esistente da migrare.

Un'altra considerazione è che Erlang scala ben oltre i soli core multipli, può scalare a un intero datacenter. Non vedo un meccanismo integrato in node.js che mi consenta di inviare un messaggio a un altro processo JS senza preoccuparmi della macchina su cui si trova, ma è integrato direttamente in Erlang ai livelli più bassi. Se il tuo problema non è abbastanza grande da richiedere più macchine o se non richiede più processi di cooperazione, è probabile che questo vantaggio non abbia importanza, quindi dovresti ignorarlo.

Erlang è davvero una pozza profonda in cui tuffarsi. Suggerirei di scrivere un programma funzionale autonomo prima di iniziare a creare app web. Un primo passo ancora più semplice, dal momento che sembri a tuo agio con Javascript, è provare a programmare JS in uno stile più funzionale. Se usi jQuery o Prototype, hai già iniziato questo percorso. Prova a rimbalzare tra la pura programmazione funzionale in Erlang o uno dei suoi parenti (Haskell, F #, Scala ...) e JS funzionale.

Una volta che sei a tuo agio con la programmazione funzionale, cerca uno dei tanti framework web Erlang; probabilmente non dovresti scrivere la tua app direttamente su qualcosa di basso livello come inetsin questa fase avanzata. Guarda qualcosa come l' azoto , per esempio.


Spesso non viene menzionato il fatto che il punto "Erlang scala a un intero datacenter" ha alcuni punti molto importanti da considerare (la sicurezza è importante). Dai
jocull

9

Anche se personalmente sceglierei Erlang, ammetto di essere un po 'prevenuto nei confronti di JavaScript. Il mio consiglio è di valutare alcuni punti:

  1. Stai riutilizzando il codice esistente in una di queste lingue (sia in termini di codice sorgente che di esperienza del programmatore!)
  2. Hai bisogno / vuoi aggiornamenti al volo senza interrompere l'applicazione (qui è dove Erlang vince per impostazione predefinita: il suo runtime è stato progettato per quel caso e OTP contiene tutti gli strumenti necessari)
  3. Quanto è grande il traffico previsto, in termini di operazioni separate e simultanee, non larghezza di banda?
  4. Quanto sono "parallele" le operazioni che svolgi per ogni richiesta?

Erlang ha una concorrenza davvero ottimizzata e un sistema distribuito parallelo trasparente alla rete. A seconda di quale sia esattamente il progetto, la disponibilità di un'implementazione matura di tale sistema potrebbe superare qualsiasi problema riguardante l'apprendimento di una nuova lingua. Ci sono anche altri due linguaggi che funzionano su Erlang VM che puoi usare, Reia simile a Ruby / Python e Erlang Lisp-Flavored .

Un'altra opzione è quella di utilizzare entrambi, soprattutto con Erlang utilizzato come una sorta di "hub". Non sono sicuro che Node.js abbia un sistema di interfaccia di funzioni esterne, ma se lo ha, Erlang ha una libreria C per i processi esterni che si interfacciano con il sistema proprio come qualsiasi altro processo Erlang.


Secondo i documenti, Node.js può sfruttare C e C ++ per componenti aggiuntivi esterni. nodejs.org/docs/v0.3.1/api/addons.html
Evan Plaice

Sembra che Reia sia morta, ma al suo posto c'è l' elisir ... mi ricorda Groovy e Java; qui sarebbero Elixir ed Erlang.
stommepoes

@EvanPlaice - Non mi impressiona molto. Il fatto è che stai fondamentalmente codificando una cosa problematica in C ++ e aggiungendoli come built-in. Non molto di un FFI è quello che stai effettivamente facendo è estendere l'emulatore. (Va bene, preferenza personale;)) La libreria esterna menzionata nel caso di erlang è quella di creare processi asincroni in altri linguaggi che si presentano come nodi O che parlano su una porta aperta (pensa a pipe bidirezionali, con dati strutturati). Tutto ciò si adatta perfettamente alla modalità di funzionamento asincrona. Ci sono anche NIF, che è essenzialmente quello che ha Node.js, ma sono scoraggiati.
p_l

1
@p_l Da quello che ho capito, l'approccio del nodo è leggermente diverso. Sebbene node sia molto bravo a gestire le chiamate I / O asincrone (cioè le richieste web), viene eseguito in un ambiente a thread singolo. Quindi è ottimo per l'invio ma non così buono per l'elaborazione ad alta intensità di CPU. Per coprire questo terreno puoi sborsare un altro processo / thread che esegue codice C / C ++ nativo. Se tutto ciò che stai facendo sono chiamate IO asincrone (ex IPC | pipe bidirezionali), node.js dovrebbe essere in grado di gestire il carico. Finché non è codificato per trascorrere molto tempo in attesa di chiamate sincrone.
Evan Plaice

5

Sembra che Erlang funzioni meglio per la distribuzione in un server di fascia relativamente bassa (VM AMD a 4 core da 512 MB a 2,4 GHz). Ciò deriva dall'esperienza di SyncPad nel confronto tra le implementazioni di Erlang e Node.js della loro applicazione server di lavagna virtuale.


2
Sì, node.js sembra avere un brutto problema di perdita di memoria. Node è piuttosto nuovo e sperimentale e né JavaScript né il motore V8 sono stati progettati per tali scenari di server. Erlang, d'altra parte, è stato progettato proprio per questo dal basso verso l'alto e ha avuto molti anni per affinarsi e maturare.
Rolf

2
Quel link sembra morto ma eccolo qui su WayBackMachine web.archive.org/web/20120902014555/http://blog.mysyncpad.com/…
jocull

4

C'è un'altra lingua sulla stessa VM che è erlang -> Elixir

È un'alternativa molto interessante a Erlang, dai un'occhiata a questa.

Inoltre ha un framework web in rapida crescita basato su di esso-> Phoenix Framework



0

Preferirò Erlang a Node. Se vuoi la concorrenza, Node può essere sostituito da Erlang o Golang a causa dei loro processi leggeri.

Erlang non è facile da imparare, quindi richiede molto impegno ma la sua comunità è attiva, quindi può ottenere aiuto da questo, questo è solo il motivo per cui le persone preferiscono Node.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.