Como o sistema de eventos do Node.js é diferente do padrão de ator do Akka?

93

Trabalho Node.jscom o Java há algum tempo e me considero muito bom com Java. Mas acabei de descobrir Akkae fiquei imediatamente interessado em seu padrão de ator (pelo que entendi).

Agora, supondo que minhas habilidades em JavaScript estejam no mesmo nível de minhas habilidades em Scala / Java, quero me concentrar na praticidade de qualquer um dos sistemas. Principalmente em termos de serviços web.

Eu entendi que o Node é excelente para lidar com muitas operações simultâneas. Eu imagino que um bom serviço da web Node para um sistema de gerenciamento de ativos seria excelente em lidar com muitos usuários enviando alterações ao mesmo tempo (em um aplicativo grande e de tráfego pesado).

Mas depois de ler sobre os atores de Akka, parece que se destacaria na mesma coisa. E gosto da ideia de reduzir o trabalho a pedaços do tamanho de uma mordida. Além disso, anos atrás eu me interessei por Erlang e me apaixonei pelo sistema de passagem de mensagens que ele usa.

Trabalho em muitos aplicativos que lidam com lógicas de negócios complexas e estou pensando que é hora de pular mais pesado em um ou outro. Especialmente atualizando aplicativos legados de Struts e C #.

De qualquer forma, evitando guerras santas, como os dois sistemas são fundamentalmente diferentes? Parece que ambos estão voltados para o mesmo objetivo. Com talvez a arquitetura de "autocura" de Akka tendo uma vantagem.

EDITAR

Parece que estou recebendo votos acirrados. Por favor, não considere esta pergunta como "o que é melhor, node ou akka?". O que estou procurando são as diferenças fundamentais em bibliotecas orientadas a eventos, como Node, e as baseadas em atores, como Akka.

cbmeeks
fonte
12
Votei em você para dizer "vá embora" para todos aqueles eleitores próximos :)
Nerrve
@cbmeeks, posso perguntar o que você escolheu e como está indo para você com sua escolha?
Jas

Respostas:

64

Sem entrar em detalhes (sobre os quais sei muito pouco no caso do Node.js), a principal diferença é que o Node.js oferece suporte apenas à simultaneidade sem paralelismo, enquanto a Akka oferece suporte a ambos. Ambos os sistemas são totalmente orientados por eventos e podem escalar para grandes cargas de trabalho, mas a falta de paralelismo torna difícil em Node.js (ou seja, o paralelismo é explicitamente codificado iniciando vários nós e despachando solicitações de acordo; portanto, é inflexível em tempo de execução) , embora seja bastante fácil na Akka devido aos seus executores multithread ajustáveis. Dadas pequenas unidades isoladas de trabalho (invocações de ator), o Akka paralelizará automaticamente a execução para você.

Outra diferença importante é que o Akka inclui um sistema para lidar com falhas de maneira estruturada (tendo cada ator supervisionado por seu pai, o que é obrigatório), enquanto o Node.js depende de convenções para que os autores passem condições de erro de retorno de chamada para retorno de chamada. O problema subjacente é que os sistemas assíncronos não podem usar a abordagem padrão de exceções empregada por sistemas baseados em pilha síncronos, porque o código de “chamada” terá passado para tarefas diferentes no momento em que o erro de retorno de chamada ocorrer. Ter o tratamento de falhas embutido no sistema torna mais provável que os aplicativos construídos nesse sistema sejam robustos.

O acima exposto não pretende ser exaustivo, tenho certeza de que há muito mais diferenças.

Roland Kuhn
fonte
1
Você acha que é a melhor maneira de usar o PLAY-FRAMEWORK ou SPRAY se eu decidir usar o AKKA para construir um aplicativo da web repousante?
ses
3
Sim, ambos são boas escolhas. O Play é adequado como uma estrutura que oferece uma experiência de desenvolvimento totalmente integrada, mas significa que o Play executará seu aplicativo. Spray é melhor se você quiser apenas ter uma camada REST fina incorporada em seu aplicativo Akka. Observe que o Spray se tornará akka-http nos próximos meses.
Roland Kuhn
2
E também para ressaltar, você obtém todas as vantagens de uma linguagem digitada estaticamente com Scala / Java e nenhum inferno de callback em javascript. Java / Scala seria mais fácil de depurar do que javascript.
Chirdeep Tomar
2
Em termos de paralelismo com o nó, deve-se mencionar que você pode bifurcar processos em tempo de execução com sua API principal do cluster . Isso fará o que você entende por atores paralelos.
kernel de
2
Parece-me que esta resposta de 2012 agora está muito desatualizada, pois muitas coisas mudaram, especialmente com o Node desde então. Consulte npmjs.com/package/webworker-threads web workers no Node, você pode mover o bloqueio de trabalho intesivo para um processo paralelo (tudo isso enquanto estiver no mesmo processo do Node).
Mark Pieszak - Trilon.io
8

Eu ainda não usei Akka, mas parece que é parecido com erlang, mas em java. Em erlang, todos os processos são como atores em Akka, eles têm caixas de correio, você pode enviar mensagens entre eles, você tem supervisores etc.

Node.js usa simultaneidade cooperativa. Isso significa que você tem simultaneidade quando permite (por exemplo, quando chama a operação io ou algum evento assíncrono). Quando você tem alguma operação longa (calculando algo em um loop longo), bloqueia todo o sistema.

Erlang usa alternância de tarefas preventiva. Quando você tem um loop longo, o sistema pode pausá-lo para executar outra operação e continuar após algum tempo. Para simultaneidade massiva, o Node.js é bom se você fizer apenas operações curtas. Ambos suportam milhões de clientes: http://blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/ http://blog.whatsapp.com/index.php/2012/01/ 1 milhão é tão 2011 /

Em java, você precisa de threads para fazer qualquer simultaneidade, caso contrário, você não pode pausar a execução dentro da função que erlang faz (na verdade, erlang faz uma pausa entre as chamadas de função, mas isso acontece com todas as funções). Você pode pausar a execução entre as mensagens.

Yetihehe
fonte
OK, supondo que eu precise gravar arquivos de log de muitas fontes diferentes. Cada vez que um aplicativo gera uma entrada de registro, também preciso enviar essa entrada para outro aplicativo para registro. Suponho que isso possa ser um processo de longa execução porque o aplicativo pode ter tempos limite de banco de dados, falhas de http, etc. Portanto, neste exemplo, uma interrupção ao gravar no banco de dados faria com que todo o meu sistema Node travasse? O AKKA teria o mesmo problema ou não estou conseguindo a correlação?
cbmeeks
1
Nenhum dos dois seria prejudicado, porque o acesso ao banco de dados normalmente é implementado como assíncrono nesses casos. Mas se você de alguma forma conseguisse fazer a biblioteca síncrona fazendo isso, ambos congelariam.
yetihehe
Obrigado. Estou tentando muito não transformar isso em um node vs akkadebate, mas tenho um problema real que preciso resolver. Eu diria que minhas habilidades em Java / JavaScript são muito próximas, mas tenho muito pouca experiência com Node e nenhuma com AKKA (ou Scala). Mas eu tenho vários aplicativos (internos por enquanto, mas externos depois) e as pessoas estão procurando maneiras de pesquisar esses logs enormes. Não é possível usar opções externas de terceiros devido a questões de privacidade. Parece que qualquer um dos dois resolveria o problema. Mas eu gosto da mensagem do AKKA, então posso explorar isso. Além disso, Java é empurrado mais aqui do que JS. Obrigado.
cbmeeks
Se você precisar pesquisar logs enormes, tente consultar o logstash ou graylog2.
Toddius Zho
6

Não tenho certeza se essa é uma comparação justa de se fazer. Eu li isso mais como "como um sistema baseado em eventos se compara a um modelo de ator?". Nodejs pode suportar um modelo de ator, assim como Scala faz em Akka, ou C # em Orleans, na verdade, verifique nactor , alguém parece já estar tentando.

Quanto à comparação entre um sistema de eventos e um modelo de ator, eu deixaria que pessoas mais sábias o descrevessem. Alguns pontos breves sobre o modelo de ator:

  • O modelo de ator é baseado em mensagem
  • Os modelos de ator tendem a funcionar bem com sistemas distribuídos (clusters). Claro que os sistemas baseados em eventos podem ser distribuídos, mas acho que o modelo de ator tem distribuição embutida com relação à distribuição de cálculos. Uma nova solicitação pode ser roteada para um novo ator em um silo diferente, sem certeza de como isso funcionaria com base em eventos.
  • O modelo de Ator suporta falha em que, se o cluster 1 parecer estar inativo, o observador geralmente pode encontrar um silo diferente para fazer o trabalho

Além disso, verifique o drama . É outra implementação do modelo de ator nodejs.

Stevebot
fonte
1
tente configurar um cluster com nodejs, você precisa de docker, kubernetees e criar o sistema distribuído. Tente também configurar o uso de mais 1 núcleo em nodejs. Akka é designado para lidar com eles. também a maturidade do próprio nodejs, a segurança e a maneira de codificar que requerem outro framework para fazer algo, é um ponto em que o nodejs em si não pode ser usado para grandes sistemas distribuídos, mas apenas no estilo MSA, pelo menos. Minha opinião de qualquer maneira.
Raffaello,