Recentemente, houve muitos elogios para o Node.js. Eu não sou um desenvolvedor que teve muita exposição a aplicativos de rede. Do meu entendimento do Nodes.js., sua força é: temos apenas um thread que lida com várias conexões, fornecendo uma arquitetura baseada em eventos.
No entanto, por exemplo, em Java, posso criar apenas um encadeamento usando NIO / AIO (que é APIs sem bloqueio do meu entendimento) e lidar com várias conexões usando esse encadeamento, além de fornecer uma arquitetura baseada em eventos para implementar os dados manipulação de lógica (não deve ser tão difícil fornecendo retorno de chamada etc.)?
Como a JVM é uma VM ainda mais madura que a V8 (também espero que seja executada mais rapidamente), e a arquitetura de manipulação baseada em eventos parece ser algo não difícil de criar, não sei por que o Node.js está atraindo tanta atenção. Perdi alguns pontos importantes?
fonte
Respostas:
Embora esse conceito possa realmente ser implementado em muitas linguagens (e como o dodgy_coder mencionou, ele foi implementado no Ruby e Python pelo menos), não é tão trivial quanto você afirma.
É verdade que o Java possui APIs de IO sem bloqueio. Assim, você pode executar E / S de disco / rede brutas de maneira não-bloqueadora. No entanto, toda API que de alguma forma envolve ou manipula E / S também precisa ser implementada de maneira não-bloqueadora. Todo analisador XML, todo driver de banco de dados, todo conversor de formato de arquivo precisa ser gravado para oferecer suporte a E / S sem bloqueio. Porque se uma única biblioteca está bloqueando esse padrão, isso reduz o desempenho dos servidores a valores da idade da pedra.
O Node.js possui essa infraestrutura de biblioteca, porque sempre foi projetada dessa maneira: toda biblioteca que se esforça para se tornar popular deve fornecer uma API assíncrona ou ela não será usada.
fonte
Provavelmente, o principal motivo é que ele usa JavaScript para gravar componentes do servidor para itens como servidores da Web, aplicativos da Web ou serviços da Web. Isso unifica o JavaScript da linguagem de desenvolvimento front-end (lado do cliente) tradicional com o idioma do lado do servidor.
Você está certo - o fato de não ser bloqueador, o uso do padrão do reator não é único - já foi feito antes do uso de outras linguagens e estruturas, como o Ruby EventMachine ou o Python's Twisted, por exemplo.
fonte
As três principais razões que eu daria são:
E / S sem bloqueio / E / S assíncrona. Isso está dividido em todos os lugares na web e nos pôsteres anteriores. Uma coisa que eu contribuiria é que projetar seu código para assumir explicitamente comportamentos assíncronos ajuda o mecanismo do compilador a maximizar o hardware. Sim, muitos dos compiladores JIT e processadores hyperthreading usam código síncrono e ajudam a paralelizar a execução. É claro que essa é a melhor abordagem de esforço. Por outro lado, ao criar explicitamente o aplicativo para assíncrono io, você garante que o mecanismo e o hardware possam maximizar o tempo de execução do seu código. É certo que não tenho dados quantificáveis para provar isso, mas isso me faz sentir quente por dentro dessa maneira.
Base de código única para cliente e servidor. Isso tem várias vantagens: ajude a otimizar os custos do datacenter, podendo mover a lógica de negócios do servidor para o cliente; ajudar a reutilizar a lógica de negócios / validação de dados; reduza a complexidade das habilidades do desenvolvedor que precisam existir para oferecer suporte ao produto (vs. Python e javascript).
Baixa barreira à entrada. De muitas maneiras, Javascirpt é como Basic, Pascal e Perl do ano passado. É super fácil começar a escrever código e não requer muito conhecimento de domínio para prosseguir. Isso também ajuda a reduzir seus custos de desenvolvimento, podendo atrair mais desenvolvedores jr e aumentar o desempenho de um projeto. [É claro que você precisa superar os ideólogos que acreditam que as linguagens de programação devem ser difíceis para eliminar os desenvolvedores com baixo desempenho]
fonte