Mes collègues et moi avons récemment discuté de la popularité de certaines technologies - en particulier Java et node.js. Après une courte navigation sur Internet, il s'est avéré que ce sont ces technologies que de nombreux géants de l'information utilisent pour développer et maintenir leurs sites sur le réseau. Ci-dessous, je ne donnerai qu'une petite partie.
Entreprises utilisant Java:
Entreprises utilisant node.js:
Il est également moins intéressant de noter que selon une recherche sur
Indeed.com (
28/06/2019 ) à la demande du développeur Java (30272 postes vacants) et du développeur node.js (7401 postes vacants), les spécialistes de ces technologies sont très recherchés.

Mais tout cela n'est que des informations générales sur la popularité. Les informations qui m'ont poussé à approfondir le sujet et à spéculer sur le sujet des caractéristiques techniques, qui ont conduit à la rédaction de cet article.
Pourquoi valent-ils la peine de comparer?
Java est un langage, node.js peut être appelé un écosystème construit sur la base de JS, et, tout d'abord, basé sur V8 - un moteur de Google.
Cependant, lorsque nous parlons de Java, nous ne parlons pas seulement du langage, mais de la machine virtuelle Java, ainsi que de l'ensemble de l'écosystème et de l'infrastructure construits autour de cette machine. Au minimum, ils peuvent être comparés sur cette base - en conséquence,
dans les deux cas, nous avons un runtime . Dans le cas de Java, il s'agit d'une machine virtuelle. Dans le cas de node.js, c'est un moteur V8 qui est disponible sur la plupart des systèmes d'exploitation, tels que Windows, Linux, MacOS et les moins connus.
Les développeurs peuvent écrire du code en utilisant le même langage, et cela fonctionnera plus ou moins de la même manière sur différents systèmes d'exploitation en raison du fait qu'il existe un runtime. L'environnement d'exécution affecte la façon dont l'interaction avec le système d'exploitation se produit. De plus, ils peuvent être comparés puisque ils sont
utilisés pour résoudre une gamme similaire de problèmes .
V8 et JVM
Lorsque le code JS entre en v8, une compilation juste à temps en code octet utilisé dans la machine virtuelle est effectuée, le code JS s'exécute de plus en plus vite.
Le code d'octet est un langage intermédiaire de haut niveau, donc dans une machine virtuelle Java, ils écrivent non seulement en Java, mais aussi en Scala et Kotlin.
Il y a des conditions préalables que dans un avenir proche pour V8, il sera possible d'utiliser non seulement JS mais aussi TypeScript ou autres. En ce moment, il y a une transcription de ces langages dans JS. À l'avenir, ils seront probablement pris en charge prêts à l'emploi et tout fonctionnera beaucoup plus rapidement.
Maintenant, il y a un développement continu de V8, et dans l'ensemble, l'apparition de nouvelles versions de node.js est associée à l'avènement d'une nouvelle version du moteur V8. Ils sont directement interconnectés.
Node.js: avantages et inconvénients
Node.js a été créé par Ryan Dahl en 2009.
Node.js lui-même comprend plusieurs composants principaux:
- Moteur V8
- bibliothèque libuv, qui est responsable de la partie centrale du nœud - une boucle d'événements, qui interagit avec le système d'exploitation, ainsi que des entrées / sorties asynchrones (E / S);
- à partir d'un ensemble de diverses bibliothèques JS et directement du langage JS lui-même.
Passons à ses avantages et inconvénients.
Avantages:- facilité et rapidité d'écriture
- légèreté
- simplicité relative (par rapport à java)
- npm (gestionnaire de packages de nœuds (un grand nombre de bibliothèques pouvant être installées sur une seule ligne)
- chaque bibliothèque tombe dans l'arbre de dépendance et tout cela se fait facilement
- développement continu (TypeScript est en cours de développement actif (qui apporte la dactylographie et les décorateurs à JS et est utilisé, par exemple, pour Angular)
Inconvénients:- la flexibilité et le développement rapide génèrent également des inconvénients vous devez surveiller constamment les mises à jour, certaines choses sont insuffisamment testées;
- il y a eu un cas où un développeur a supprimé sa bibliothèque de NPM et de nombreuses applications l'utilisant ont cessé de fonctionner;
Avantages et inconvénients de Java
En revanche, considérez immédiatement les principales fonctionnalités de Java.
Avantages:- vitesse de travail
- prévalence (dans les universités de nombreux pays, ils étudient le java, il est également pratique d'étudier la POO en java),
- énorme ensemble de bibliothèques.
Inconvénients:- lourdeur
- certains paradigmes Java ont été créés depuis longtemps et sont déjà dépassés,
- JDK est propriétaire, donc Java se développe lentement.
Récemment, JS a commencé à dépasser Java (et plus loin, plus).
Java quitte également le monde Android, il est remplacé par Kotlin qui, bien qu'il utilise la JVM, reste un langage différent.
Conflit Oracle et Google

Java a été créé par Sun, qui a ensuite été acquis par Oracle et lui appartient toujours. Pour cette raison, pour de nombreuses entreprises, l'utilisation de Java crée des problèmes.
Google avait des problèmes quand Oracle a entamé une poursuite avec eux pour utiliser Java dans Android. Pour cette raison, Google a adopté très activement Kotlin, qui est apparu indépendamment. Java est propriétaire. Mais il existe une machine virtuelle Oracle, ainsi qu'une machine virtuelle Java ouverte (JVM ouverte), qui est utilisée sous Linux et écrite en open source. Parfois, il y a des incompatibilités, mais récemment, elles sont de moins en moins.
Soit dit en passant, Google n'a pas été en mesure d'abandonner complètement Java. Dans Dalvik, qui est utilisé comme noyau dans Android, la JVM est intégrée. Peut-être laisseront-ils cela, mais ce sera très difficile à faire parce que la quasi-totalité de l'écosystème Android est basée sur Java - principalement sur l'utilisation d'une machine virtuelle Java modernisée. Et cela, à un moment donné, a également été la raison du conflit entre Oracle et Google, car Oracle interdit simplement de mettre à jour la JVM. C'est la partie la plus importante de Java. Et la langue elle-même peut être utilisée sans presque aucune restriction.
Java vs node.js: performances et consommation de ressources
Tout d'abord, il convient de noter que les performances Java sont bien supérieures à celles de JS et, par conséquent, node.js.
Performances de Node.js et JavaSi vous exécutez une tâche simple, comme la quadrature, les indicateurs peuvent varier jusqu'à 10 fois dans les tests. Si vous exécutez des boucles dans des millions de tâches de calcul, Java dépassera presque toujours node.js. De plus, l'énorme différence entre Java et node.js est que le nœud est monothread, ce qui est à la fois un avantage et un inconvénient.
Java peut fonctionner avec des flux pris en charge au niveau du système d'exploitation, et il s'avère qu'un programme écrit en Java tire le meilleur parti des capacités du système d'exploitation. Et si vous avez besoin d'écrire une application très chargée qui utilisera un grand nombre de calculs, alors Java sera certainement mieux pour cela. Le problème est que même un petit serveur écrit en Java prendra beaucoup de mémoire - à la fois sur disque et en ligne.
Node.js est léger en raison de son architecture événementielle. Il est conçu pour fonctionner comme un serveur Web et fait un très bon travail de maintenance des tâches légères. Par exemple, une requête simple comme calculer quelque chose ou écrire dans une base de données se produit très rapidement. Et s'il y a beaucoup de demandes et que nous voulons faire évoluer le système en nœud, vous pouvez utiliser le serveur Web Nginx ou Apache. Vous pouvez avoir plusieurs instances de nœuds identiques. Ensuite, tout sera distribué via un équilibrage de charge à tour de rôle. Si nous exécutons 8 instances de nœuds sur 16 cœurs, respectivement, le système d'exploitation lui-même répartira les instances entre les noyaux. Le nœud ne contrôle pas cela, il aura un thread.
Contrôle de flux en Java et node.js
En Java, nous pouvons créer une application et y exécuter 8 threads. En raison de l'interaction plus étroite avec le système d'exploitation, vous pouvez répartir la charge.
Comme vous le savez, l'un des serveurs Web écrits en Java est tomcat. Là, vous pouvez clairement voir que lorsque l'utilisateur fait une demande, des threads supplémentaires sont lancés. Et lorsque la demande parvient au nœud, la boucle d'événements sera traitée et renvoyée, puis la prochaine demande viendra. Et du fait que nous n'attendons pas les résultats du premier, il sera également repris. Bien que les demandes soient légères, tout va bien. Cependant, lorsqu'un calcul lourd est effectué, s'il existe une instance, le nœud s'arrête et un délai d'attente se produit.
Gestion des threads JavaSur le nœud, vous pouvez écrire quelques lignes de code et obtenir le serveur Web le plus simple. Naturellement, pour une fonctionnalité plus large, où il y aura des notifications, des autorisations, une journalisation, etc. il est plus difficile à mettre en œuvre, mais il existe des cadres qui vous permettent de résoudre ces problèmes.
Contrôle de flux dans node.jsJava a une API développée - API de concurrence, qui vous permet de travailler avec des threads compétitifs. Mais en même temps, c'est l'un des problèmes puisque la compétitivité est une chose très compliquée et tous les développeurs ne connaissent pas bien cela.
Le web, l'API REST est l'élément du nœud, et parfois ils l'utilisent. Mais si nous avons affaire à des calculs complexes, il vaut toujours mieux utiliser Java.
Mon projet java
En Java, j'avais un projet intéressant - une application distribuée, dont la tâche principale était de traiter de grandes quantités d'informations graphiques pour une utilisation ultérieure dans des répertoires. Lors de la création d'un catalogue, vous devez préparer des ensembles d'un grand nombre d'images de différentes résolutions qui seront utilisées pour créer le catalogue. Autrement dit, il s'agit d'une application pour automatiser la préparation du catalogue prépresse.
Les photographes devaient tout faire manuellement. Vous avez d'abord dû utiliser une petite application pour télécharger vos images. De plus, le spécialiste de la création de l'annuaire a dû développer la structure de l'annuaire via une autre application. Ensuite, dans une autre application, un flux de travail a été créé qui a jeté des images dans la structure qui a été créée. En général, le processus a été assez difficile. ImageMagick utilisé qui est sous Linux, Windows, MacOS. Nous avions affaire à Linux.
Par exemple, une image .tiff de 200 à 300 mb a été chargée dans l'application, et à partir de celle-ci, il était nécessaire de faire des images de différentes résolutions, de couper quelque chose ou de créer un substrat.
La première version de l'application ne pouvait pas faire face à la lourde charge, même un serveur avec 16 processeurs de base manquait. Nous avons amélioré l'architecture de l'application pour utiliser plusieurs instances en même temps afin de ne pas changer fondamentalement l'application. De nombreuses instances ont été lancées qui ont interagi entre elles et chacune d'elles a traité une partie de la tâche. C'était difficile, mais nous avons réussi à tout mettre en œuvre en quelques mois seulement. Et le système fonctionne toujours. Ce faisant, nous avons dû faire face à la concurrence et à divers aspects de l'interaction.
Quelque chose de ce projet pourrait toujours être porté sur le nœud, mais certaines choses devraient encore être faites en Java, car il y avait de nombreux calculs différents. Fondamentalement, nous pourrions créer des parties sur le nœud qui invoqueraient certaines parties en Java et utiliseraient une architecture de microservice. Vous pouvez utiliser une version mixte. Mais cette approche ne fonctionne pas toujours, car un développeur spécialisé dans le nœud peut ne pas être un spécialiste de Java et vice versa. Et trouver des développeurs universels est beaucoup plus difficile.
De l'expérience sur node.js
Il y avait un projet pour organiser une grande quantité de données. Quelque chose de similaire au projet décrit ci-dessus. Seulement ici, nous téléchargeons un fichier qui contient un grand ensemble d'informations et est soumis à validation par un service tiers (écrit en java), plusieurs fois et selon différentes règles. Il était nécessaire de traiter des centaines de gigaoctets d'informations, et le nœud n'était pas destiné à cela.
Il était particulièrement intéressant de concevoir l’architecture du système, L'application consistait en plusieurs microservices, dont des tiers. Lorsque vous travaillez avec un service tiers qui a effectué la validation, nous avons utilisé le courtier de messages RabbitMQ. Nous avons donné les informations nécessaires à un serveur tiers et reçu un message de RabbitMQ après la fin de la validation, puis les données ont été traitées en partie pour éviter une mémoire insuffisante.
Et si initialement l'application a traité un fichier contenant 10 000 enregistrements, elle peut désormais en traiter jusqu'à un million. Nous avons quand même réussi à résoudre ce problème en utilisant node.js, bien qu'en Java il puisse être résolu plus facilement, cependant, le client voulait utiliser exactement node, car J'avais besoin d'une infrastructure et d'une architecture unifiées avec des microservices écrits en JS. L'utilisation de node pour résoudre le problème était beaucoup plus compliquée et demandait plus de temps, mais node.js gagne en raison de l'évolutivité. C'est pourquoi nous pouvons désormais augmenter le nombre de travailleurs et traiter de plus en plus de données. En Java, ce serait plus compliqué.
En fait, tout problème peut être résolu de cette façon et cela, mais cela vaut la peine d'être répété ici: s'il y a beaucoup de calculs, il est préférable d'utiliser Java, s'il n'y a pas beaucoup de calculs, vous pouvez utiliser en toute sécurité node.
Résumé et perspectives: node.js pourra-t-il dépasser Java?
Maintenant, il s'agit du fait que node.js sera souvent utilisé comme wrapper, et la farce sera écrite dans d'autres langues. Ses lacunes sont connues depuis longtemps. Par exemple, une faille conditionnelle telle que le thread unique a déjà été corrigée. La dernière version de node introduit la possibilité d'utiliser plusieurs threads.
Java a été à l'origine créé comme une solution légère remplaçant C ++, et est maintenant devenu lourd. C'est comme l'évolution. Peut-être qu'un jour, il y aura quelque chose qui remplacera le nœud.
Modules - Développement Java vs node.jsMaintenant, selon le nombre de commandes et selon mes sentiments, node.js est déjà en avance sur Java.
JS se développe activement et il va changer - peut-être que quelque chose viendra le remplacer.
Désormais, aucun concurrent potentiel ne pourrait remplacer Java et node.js.
Le problème est que le développement Java a été plutôt lent ces derniers temps, et node.js se développe à une vitesse telle qu'il n'est pas possible de le remplacer dans un avenir proche.