Node.js ou Java: desempenho, recursos, controle de fluxo, popularidade e experiência pessoal

Meus colegas e eu discutimos recentemente a popularidade de algumas tecnologias - em particular, Java e node.js. Após uma breve navegação na Internet, constatou-se que eram essas tecnologias que muitos gigantes da informação usam para desenvolver e manter seus sites na rede. Abaixo, darei apenas uma pequena parte.

Empresas que usam Java:

imagem

Empresas que usam o node.js:

imagem

Também é menos interessante que, de acordo com uma pesquisa em Indeed.com ( 28/06/2019 ) a pedido do Java Developer (30272 vagas) e do node.js developer (7401 vagas), especialistas nessas tecnologias são bastante procurados.

imagem

Mas tudo isso são apenas informações gerais sobre popularidade. As informações que me levaram a aprofundar o assunto e especular sobre o assunto de recursos técnicos, o que levou à redação deste artigo.

Por que vale a pena comparar?


Java é uma linguagem, node.js pode ser chamado de ecossistema construído com base no JS e, antes de tudo, baseado no V8 - um mecanismo do Google.

Entretanto, quando falamos de Java, falamos não apenas da linguagem, mas também da máquina virtual Java, bem como de todo o ecossistema e infraestrutura construídos em torno dessa máquina. No mínimo, eles podem ser comparados com base nisso - como resultado, nos dois casos, temos um tempo de execução . No caso de Java, é uma máquina virtual. No caso do node.js, é um mecanismo V8 disponível na maioria dos sistemas operacionais, como Windows, Linux, MacOS e sistemas menos conhecidos.

Os desenvolvedores podem escrever código usando o mesmo idioma, e isso funcionará mais ou menos da mesma maneira em diferentes sistemas operacionais, devido ao fato de haver um tempo de execução. O ambiente de tempo de execução afeta como a interação com o sistema operacional ocorre. Além disso, eles podem ser comparados desde eles são usados ​​para resolver uma gama semelhante de problemas .

V8 e JVM


Quando o código JS entra na v8, just in time a compilação no código de bytes usado na máquina virtual é executada, o código JS é executado cada vez mais rápido.
O código de bytes é uma linguagem intermediária de alto nível; portanto, em uma máquina virtual Java, eles escrevem não apenas em Java, mas também em Scala e Kotlin.

Existem pré-requisitos para que no futuro próximo para a V8 seja possível usar não apenas JS, mas também TypeScript ou outros. No momento, há uma tradução dessas linguagens em JS. No futuro, eles provavelmente serão suportados de imediato e tudo funcionará muito mais rápido.

Agora, há um desenvolvimento contínuo da V8 e, em geral, a aparência de novas versões do node.js está associada ao advento de uma nova versão do mecanismo da V8. Eles estão diretamente interconectados.

Node.js: vantagens e desvantagens


O Node.js foi criado por Ryan Dahl em 2009.

O próprio Node.js inclui vários componentes principais:

  • Motor V8
  • biblioteca libuv, responsável pela parte central do nó - um loop de eventos que interage com o sistema operacional, bem como pela entrada / saída assíncrona (E / S);
  • de um conjunto de várias bibliotecas JS e diretamente a própria linguagem JS.

Vamos passar aos seus prós e contras.

Prós:

  • facilidade e velocidade de escrita
  • leveza
  • simplicidade relativa (em comparação com java)
  • npm (gerenciador de pacotes de nós (um grande número de bibliotecas que podem ser instaladas em uma linha)
  • cada biblioteca cai na árvore de dependência e tudo isso é feito facilmente
  • desenvolvimento contínuo (o TypeScript está sendo desenvolvido ativamente (que traz digitação, decoradores para JS e é usado, por exemplo, para Angular)

Contras:

  • flexibilidade e desenvolvimento rápido também gera desvantagens, você precisa monitorar constantemente as atualizações, algumas coisas saem insuficientemente testadas;
  • houve um caso em que um desenvolvedor removeu sua biblioteca do NPM e muitos aplicativos que o utilizavam pararam de funcionar;

Vantagens e desvantagens do Java


Por outro lado, considere imediatamente os principais recursos do Java.

Prós:

  • velocidade do trabalho
  • prevalência (em universidades de muitos países estudam java, também é conveniente estudar OOP em java),
  • enorme conjunto de bibliotecas.

Contras:

  • peso
  • alguns paradigmas Java foram criados há muito tempo e já estão desatualizados,
  • O JDK é proprietário, então o Java está se desenvolvendo lentamente.

Recentemente, o JS começou a superar o Java (e quanto mais longe, mais).
O Java também deixa o mundo do Android, sendo substituído pelo Kotlin que, embora use a JVM, ainda é uma linguagem diferente.

Conflito entre Oracle e Google


imagem

O Java foi criado pela Sun, que mais tarde foi adquirida pela Oracle e ainda pertence a ela. Por esse motivo, para muitas empresas que usam Java cria alguns problemas.

O Google estava com problemas quando a Oracle iniciou um processo com eles por usar Java no Android. Por isso, o Google adotou ativamente o Kotlin, que apareceu de forma independente. Java é proprietário. Mas há uma máquina virtual Oracle, bem como uma máquina virtual Java aberta (JVM aberta), usada no Linux e escrita em código aberto. Às vezes, existem algumas incompatibilidades, mas recentemente elas são cada vez menos.

A propósito, o Google não conseguiu abandonar completamente o Java. No Dalvik, que é usado como o núcleo no Android, a JVM é incorporada. Talvez eles deixem isso, mas será muito difícil fazer isso porque quase todo o ecossistema Android é construído em Java - principalmente no uso de uma JVM modernizada. E esse, em algum momento, também foi a razão do conflito entre Oracle e Google, porque a Oracle proíbe apenas atualizar a JVM. Esta é a parte mais importante do Java. E o próprio idioma pode ser usado quase sem restrições.

Java vs node.js: desempenho e consumo de recursos


Antes de tudo, vale a pena notar que o desempenho do Java é muito superior ao do JS e, consequentemente, do node.js.

imagem
Desempenho do Node.js e Java

Se você executar alguma tarefa simples, como quadratura, em testes, os indicadores poderão variar até 10 vezes. Se você executar loops em milhões de tarefas de cálculo, o Java quase sempre ultrapassará o node.js. Além disso, a enorme diferença entre Java e node.js é que o nó é de thread único, o que é uma vantagem e uma desvantagem, por outro lado.

O Java pode trabalhar com fluxos suportados no nível do sistema operacional, e acontece que um programa escrito em Java aproveita ao máximo os recursos do sistema operacional. E se você precisar escrever um aplicativo altamente carregado que utilizará um grande número de cálculos, o Java será definitivamente melhor para isso. O problema é que mesmo um pequeno servidor gravado em Java consome muita memória - tanto em disco quanto online.

O Node.js é leve devido à sua arquitetura orientada a eventos. Ele foi desenvolvido para funcionar como um servidor da Web e faz um excelente trabalho de manutenção de tarefas leves. Por exemplo, uma consulta simples, como calcular algo ou gravar em um banco de dados, acontece muito rapidamente. E se houver muitas solicitações e desejarmos dimensionar o sistema no nó, você pode usar o servidor da web Nginx ou Apache. Você pode ter muitas instâncias de nó idênticas. Em seguida, tudo será distribuído por meio do balanceamento de carga round-robin. Se executarmos instâncias de 8 nós em 16 núcleos, respectivamente, o próprio sistema operacional distribuirá as instâncias entre os kernels. O nó não controla isso, ele terá um thread.

Controle de fluxo em Java e node.js


Em Java, podemos criar um aplicativo e executar 8 threads nele. Devido ao fato de haver uma interação mais próxima com o sistema operacional, você pode distribuir a carga.

Como você sabe, um dos servidores da Web escritos em Java é o tomcat. Lá você pode ver claramente que quando o usuário faz uma solicitação, threads adicionais são iniciados. E quando a solicitação chegar ao nó, o loop de eventos será processado e enviado de volta, e a próxima solicitação virá. E devido ao fato de que não esperamos os resultados do primeiro, ele também será captado. Embora os pedidos sejam leves, tudo está bem. No entanto, quando um cálculo pesado é executado, se houver uma instância, o nó para e ocorre um tempo limite.

imagem
Gerenciamento de encadeamento Java

No nó, você pode escrever apenas algumas linhas de código e obter o servidor da Web mais simples. Naturalmente, para uma funcionalidade mais ampla, onde haverá notificações, autorizações, registros etc. é mais difícil de implementar, mas existem estruturas que permitem resolver esses problemas.

imagem
Controle de fluxo no node.js

Java possui uma API desenvolvida - API de simultaneidade, que permite trabalhar com threads competitivos. Mas, ao mesmo tempo, esse é um dos problemas, já que competitividade é uma coisa muito complicada e nem todo desenvolvedor é bem versado nisso.

A web, a API REST é o elemento do nó e, às vezes, eles o usam. Mas se estamos lidando com cálculos complexos, ainda é melhor usar Java.

Meu projeto java


Em Java, eu tinha um projeto interessante - um aplicativo distribuído, cuja principal tarefa era processar grandes quantidades de informações gráficas para uso posterior em diretórios. Ao criar um catálogo, você precisa preparar conjuntos de um grande número de imagens de várias resoluções que serão usadas para criar o catálogo. Simplificando, este é um aplicativo para automatizar a preparação do catálogo de pré-impressão.

Os fotógrafos costumavam fazer tudo manualmente. Primeiro você teve que usar algum aplicativo pequeno para fazer upload de suas imagens. Além disso, o especialista que criou o diretório teve que desenvolver a estrutura de diretórios por meio de outro aplicativo. Em outro aplicativo, foi criado um fluxo de trabalho que exibia imagens na estrutura criada. Em geral, o processo foi bastante difícil. ImageMagick usado que está no Linux, Windows, MacOS. Estávamos lidando com Linux.

Por exemplo, uma imagem .tiff com tamanho de 200 a 300 mb foi carregada no aplicativo e a partir dela foi necessário fazer fotos de várias resoluções, cortar algo ou criar um substrato.
A primeira versão do aplicativo não conseguiu lidar com a carga pesada, até mesmo um servidor com 16 processadores principais estava ausente. Melhoramos a arquitetura do aplicativo para usar várias instâncias ao mesmo tempo, para não alterar fundamentalmente o aplicativo. Foram iniciadas muitas instâncias que interagiram entre si e cada uma delas processou uma parte da tarefa. Foi difícil, mas conseguimos implementar tudo com sucesso em apenas alguns meses. E o sistema ainda funciona. No processo, tivemos que lidar com a concorrência e vários aspectos da interação.

Algo deste projeto ainda pode ser portado para o nó, mas algumas coisas ainda precisam ser feitas em Java, porque houve muitos cálculos diferentes. Basicamente, poderíamos criar partes no nó que invocassem certas partes em Java e usassem uma arquitetura de microsserviço. Você poderia usar uma versão mista. Mas essa abordagem nem sempre funciona, porque um desenvolvedor especializado em nó pode não ser um especialista em Java e vice-versa. E encontrar desenvolvedores universais é muito mais difícil.

Da experiência em node.js


Havia um projeto para organizar uma grande quantidade de dados. Algo semelhante ao projeto descrito acima. Somente aqui é feito o download de um arquivo que contém um grande conjunto de informações e está sujeito à validação por meio de um serviço de terceiros (escrito em java), várias vezes e de acordo com regras diferentes. Era necessário processar centenas de gigabytes de informações e o nó não se destinava a isso.

Foi especialmente interessante projetar a arquitetura do sistema, pois O aplicativo consistia em vários microsserviços, incluindo de terceiros. Ao trabalhar com um serviço de terceiros que executou a validação, usamos o broker de mensagens RabbitMQ. Nós fornecemos as informações necessárias para um servidor de terceiros e recebemos uma mensagem do RabbitMQ após o término da validação; os dados foram processados ​​em partes para evitar falta de memória.

E se inicialmente o aplicativo processou um arquivo contendo 10.000 registros, agora pode processar até um milhão. Ainda conseguimos resolver esse problema usando o node.js, embora em Java ele pudesse ser resolvido com mais facilidade, no entanto, o cliente queria usar exatamente o nó, porque Eu precisava de uma infraestrutura e arquitetura unificadas com microsserviços escritos em JS. Usar o node para resolver o problema era muito mais complicado e exigia mais tempo, mas o node.js vence devido à escalabilidade. É por isso que agora podemos aumentar o número de trabalhadores e processar mais e mais dados. Em Java, isso seria mais complicado.

De fato, qualquer problema pode ser resolvido desta maneira e de outra, mas vale a pena repetir aqui: se houver muitos cálculos, é melhor usar Java; se não houver muitos cálculos, você poderá usar o nó com segurança.

Resumo e perspectivas: o node.js poderá superar o Java?


Agora, chega-se ao fato de que o node.js geralmente será usado como wrapper e o material será escrito em outros idiomas. Suas deficiências são conhecidas há muito tempo. Por exemplo, uma falha condicional como a segmentação única já foi corrigida. A versão mais recente do nó apresenta a capacidade de usar vários encadeamentos.

O Java foi originalmente criado como uma solução leve, substituindo o C ++, e agora se tornou pesado. É como evolução. Talvez um dia haja algo que substitua o nó.

imagem
Módulos - Desenvolvimento Java vs node.js

Agora, de acordo com o número de pedidos e de acordo com meus sentimentos, o node.js já está à frente do Java.
JS está desenvolvendo ativamente e mudará - talvez algo venha a substituí-lo.
Agora não há concorrente em potencial que possa substituir Java e node.js.

O problema é que o desenvolvimento Java tem sido bastante lento ultimamente, e o node.js está se desenvolvendo a uma velocidade que não é possível substituí-lo em um futuro próximo.

Source: https://habr.com/ru/post/pt460125/


All Articles