Node.js ou Erlang

86

Eu realmente gosto dessas ferramentas quando se trata do nível de simultaneidade com que elas podem lidar.

Erlang / OTP parece uma solução muito mais estável, mas requer muito mais aprendizado e muito mergulho no paradigma da linguagem funcional. E parece que Erlang / OTP o torna muito melhor quando se trata de CPUs multi-core (corrija-me se estiver errado).

Mas qual devo escolher? Qual é o melhor na perspectiva de curto e longo prazo?

Meu objetivo é aprender uma ferramenta que torne o dimensionamento de meus projetos da Web sob alta carga mais fácil do que as linguagens tradicionais.

user80805
fonte
Você pode usar JavaScript como uma linguagem funcional com underscorejs.org
Todd Moses
2
@ToddMoses tem certeza de que comentou a pergunta certa?
Flavien Volken
Maçãs e laranjas. Node.JS (em seu núcleo) é libevent (C) + interoperabilidade Javascript. Erlang é uma implementação de IO totalmente customizada. Node.JS é feito para aplicativos de thread único. Seu delema é você quer um emprego no Facebook / Google, ou você quer fazer um software kickass.
Vans S de

Respostas:

87

Eu daria uma chance a Erlang. Mesmo que seja uma curva de aprendizado mais íngreme, você aproveitará melhor, pois estará aprendendo uma linguagem de programação funcional. Além disso, como Erlang foi projetado especificamente para criar sistemas confiáveis ​​e altamente simultâneos, você aprenderá muito sobre como criar serviços altamente escaláveis ​​ao mesmo tempo.

Justin Ethier
fonte
10
Não acho que Erlang seja um pouco mais complexo do que Javascript. Não há nenhum tipo de herança em Erlang, então você sempre tem certeza de qual função você chama. Não há conversão de tipo implícita em Erlang, então você sempre tem certeza de quais tipos de dados usa. Não há atribuição destrutiva, então você sempre tem certeza de que não quebrará algum código antigo porque algum código novo no retorno de chamada alterou seu estado interno.
Dmitry Belyaev
51

Não posso falar por Erlang, mas algumas coisas que não foram mencionadas sobre o nó:

  • O Node usa o mecanismo V8 do Google para compilar o javascript em código de máquina. Portanto, o nó é realmente muito rápido. Portanto, isso se soma aos benefícios de velocidade oferecidos pela programação orientada a eventos e io sem bloqueio.
  • Node tem uma comunidade bem ativa. Pule no grupo IRC deles no freenode e você verá o que quero dizer
  • Percebi que os comentários acima pressionam Erlang com base no fato de que será útil aprender uma linguagem de programação funcional. Embora eu concorde que é importante expandir seu conjunto de habilidades e obter um deles, você não deve basear um projeto no fato de que deseja aprender um novo estilo de programação
  • Por outro lado, Javascript já está em um paradigma no qual você se sente confortável para escrever! Além disso, é javascript, portanto, quando você escrever o código do lado do cliente, ele terá uma aparência consistente.
  • A comunidade do node já lançou toneladas de módulos ! Existem módulos para redis, mongodb, couch e tudo o mais. Outro bom módulo para olhar é o Express (pense em Sinatra para nó)

Confira o vídeo no blog do yahoo por Ryan Dahl, o cara que realmente escreveu o node. Acho que isso ajudará a ter uma ideia melhor de onde o nó está e para onde está indo.

Lembre-se de que o nó ainda está em estágios finais de desenvolvimento e, portanto, está passando por algumas mudanças - mudanças que quebraram o código anterior. No entanto, supostamente está em um ponto em que você pode esperar que a API não mude muito mais. Então, se você está procurando algo divertido, eu diria que o node é uma ótima escolha.

Jarsen
fonte
26
Acho que o motor V8 compila JavaScript para código de máquina e não para montagem.
Jonas
10
Ter tanto trabalho feito em torno do Javascript não torna a linguagem nem um pouco adequada para resolver problemas complexos. A linguagem em si é horrível com todos aqueles casos especiais na conversão de tipos. E o estilo de retorno de chamada onde as variáveis ​​são alteradas em centenas de lugares diferentes e o inferno com a procura do lugar onde alguma atribuição ocorreu.
Dmitry Belyaev
15

Sou um programador de Erlang de longa data e essa pergunta me levou a dar uma olhada em node.js. Parece muito bom.

Parece que você precisa gerar vários processos para tirar proveito de vários núcleos. Não consigo ver nada sobre como definir a afinidade do processador. Você pode usar o conjunto de tarefas no Linux, mas provavelmente deve ser parametrizado e definido no programa.

Também notei que o suporte da plataforma pode ser um pouco mais fraco. Especificamente, parece que você precisa executar o suporte Cygwin para Windows.

Parece bom.


Editar

Node.js agora tem suporte nativo para Windows.

dsmith
fonte
5
Esta resposta é um pouco velha. No momento, o Node é multiplataforma, não há necessidade de ter Cygwin para Windows. E o Node tem suporte integrado para clustering em uma máquina, compartilhando os soquetes TCP.
Farid Nouri Neshat
9

Estou olhando para as mesmas duas alternativas que você está, entendido, para vários projetos.

Até agora, a melhor máquina de barbear que descobri para decidir entre eles para um determinado projeto é se eu preciso usar Javascript. Um sistema existente que estou tentando migrar já está escrito em Javascript, então sua próxima versão provavelmente será feita em node.js. Outros projetos serão feitos em alguma estrutura da web Erlang porque não há base de código existente para migrar.

Outra consideração é que Erlang pode ser dimensionado muito além de apenas vários núcleos, ele pode ser dimensionado para um datacenter inteiro. Não vejo um mecanismo embutido em node.js que me permite enviar uma mensagem a outro processo JS sem me importar em qual máquina está, mas isso está embutido em Erlang nos níveis mais baixos. Se o seu problema não for grande o suficiente para precisar de várias máquinas ou se não exigir vários processos de cooperação, essa vantagem provavelmente não fará diferença, portanto, você deve ignorá-la.

Erlang é de fato um poço profundo para se mergulhar. Eu sugeriria escrever um programa funcional autônomo antes de começar a construir aplicativos da web. Um primeiro passo ainda mais fácil, já que você parece confortável com Javascript, é tentar programar JS em um estilo mais funcional. Se você usa jQuery ou Prototype, você já começou a trilhar esse caminho. Tente alternar entre a programação funcional pura em Erlang ou um de seus parentes (Haskell, F #, Scala ...) e JS funcional.

Quando estiver confortável com a programação funcional, procure uma das muitas estruturas da Web Erlang; você provavelmente não deveria escrever seu aplicativo diretamente para algo de baixo nível como inetsneste estágio final. Veja algo como Nitrogênio , por exemplo.

Warren Young
fonte
Muitas vezes não é mencionado que o ponto "Erlang escala para um datacenter inteiro" tem alguns pontos muito importantes a serem considerados (a segurança é um grande problema). Confira o capítulo sobre isso aqui: learnyousomeerlang.com/distribunomicon
jocull
9

Embora eu pessoalmente prefira Erlang, admito que sou um pouco preconceituoso contra o JavaScript. Meu conselho é que você avalie alguns pontos:

  1. Você está reutilizando o código existente em qualquer uma dessas linguagens (tanto em termos de código-fonte quanto em experiência do programador!)
  2. Você precisa / deseja atualizações imediatas sem interromper o aplicativo (é aqui que Erlang vence por padrão - seu tempo de execução foi projetado para esse caso e OTP contém todas as ferramentas necessárias)
  3. Qual é o tamanho do tráfego esperado, em termos de operações simultâneas separadas, não largura de banda?
  4. Quão "paralelas" são as operações que você faz para cada solicitação?

Erlang realmente aperfeiçoou a concorrência e o sistema distribuído paralelo transparente para a rede. Dependendo do que exatamente é o projeto, a disponibilidade de uma implementação madura de tal sistema pode superar quaisquer problemas relacionados ao aprendizado de um novo idioma. Existem também duas outras linguagens que funcionam em Erlang VM que você pode usar, a Ruby / Python-like Reia e Lisp-Flavored Erlang .

Outra opção é usar ambos, especialmente com Erlang sendo usado como uma espécie de "hub". Não tenho certeza se Node.js tem sistema de interface de função estrangeira, mas se tiver, Erlang tem biblioteca C para processos externos para fazer interface com o sistema como qualquer outro processo Erlang.

p_l
fonte
De acordo com os documentos, o Node.js pode aproveitar C e C ++ para complementos externos. nodejs.org/docs/v0.3.1/api/addons.html
Evan
Parece que Reia morreu, mas em seu lugar está o elixir ... me lembra de Groovy e Java; aqui seriam Elixir e Erlang.
Stommepoes
@EvanPlaice - Isso não me impressiona muito. O fato é que você basicamente codifica algo problemático em C ++ e os adiciona como integrados. Não muito de um FFI é o que você está realmente fazendo é estendendo o emulador. (Ok, preferência pessoal;)) A biblioteca externa mencionada no caso de erlang é fazer processos assíncronos em outras linguagens que aparecem como nós OU que falam sobre uma porta aberta (pense em um pipe bidirecional, com dados estruturados). Tudo isso se encaixa perfeitamente no modo assíncrono de operação. Também existem NIFs, que é essencialmente o que o Node.js tem, mas são desencorajados.
p_l
1
@p_l Pelo que entendi, a abordagem do nó é um pouco diferente. Embora o node seja muito bom em lidar com chamadas IO assíncronas (ou seja, solicitações da web), ele é executado em um ambiente de thread único. Portanto, é ótimo no despacho, mas não tão bom no processamento intensivo da CPU. Para cobrir esse terreno, você pode bifurcar outro processo / thread que execute código C / C ++ nativo. Se tudo o que você está fazendo são chamadas IO assíncronas (ex IPC | tubos bidirecionais), o node.js deve ser capaz de lidar com a carga. Contanto que não esteja codificado para passar muito tempo esperando chamadas síncronas.
Evan Plaice,
5

Parece que o Erlang tem um desempenho melhor para implantação em um servidor relativamente simples (512 MB 4 núcleos e 2,4 GHz AMD VM). Isso vem da experiência da SyncPad em comparar as implementações Erlang e Node.js de seu aplicativo de servidor de quadro branco virtual.

adib
fonte
2
Sim, node.js parece estar tendo um problema de vazamento de memória desagradável. O Node é bastante novo e experimental e nem o JavaScript nem o mecanismo V8 foram projetados para esses cenários de servidor. Erlang, por outro lado, foi projetado apenas para isso de baixo para cima e teve muitos anos para se refinar e amadurecer.
Rolf
2
Esse link parece morto, mas aqui está na WayBackMachine web.archive.org/web/20120902014555/http://blog.mysyncpad.com/…
jocull de
4

Há mais um idioma na mesma VM que erlang é -> Elixir

É uma alternativa muito interessante para Erlang, veja esta.

Também tem uma estrutura da web de rápido crescimento baseada nele-> Phoenix Framework

NoDisplayName
fonte
0

Eu preferirei Erlang ao Node. Se você quiser simultaneidade, o Node pode ser substituído por Erlang ou Golang por causa de seus processos leves.

Erlang não é fácil de aprender, então requer muito esforço, mas sua comunidade é ativa, então você pode obter ajuda, esta é apenas a razão pela qual as pessoas preferem o Node.

Sumit Pugalia
fonte