Récemment, il y a eu beaucoup d'éloges pour Node.js. Je ne suis pas un développeur qui a beaucoup été exposé aux applications réseau. D'après ma compréhension même de Nodes.js, sa force est la suivante: nous avons un seul thread qui gère plusieurs connexions et fournit une architecture basée sur des événements.
Cependant, par exemple en Java, je ne peux créer qu'un seul thread à l'aide de NIO / AIO (ce qui est une API non bloquante de ma compréhension), et gérer plusieurs connexions à l'aide de ce thread, et je fournis une architecture basée sur les événements pour implémenter les données. logique de traitement (ne devrait pas être aussi difficile en fournissant un rappel, etc.)?
Etant donné que la machine virtuelle Java est une machine virtuelle encore plus mature que la version 8 (je pense qu’elle sera également plus rapide), et que l’architecture de gestion basée sur les événements ne semble pas difficile à créer, je ne sais pas pourquoi Node.js attire autant l’attention. Ai-je oublié des points importants?
la source
Réponses:
Bien que ce concept puisse effectivement être implémenté dans de nombreuses langues (et, comme le dit dodgy_coder , il a été implémenté au moins en Ruby et Python), ce n’est pas aussi trivial que vous le dites.
Certes, Java possède des API IO non bloquantes. Ainsi, vous pouvez effectuer des E / S de réseau / disque brutes de manière non bloquante. Cependant, chaque API qui encapsule ou gère les E / S doit être implémentée de manière non bloquante. Chaque analyseur XML, chaque pilote de base de données, chaque convertisseur de format de fichier doit être écrit pour prendre en charge les E / S non bloquantes. En effet, si une seule bibliothèque bloque ce modèle, les performances de votre serveur seront alors dégradées.
Node.js possède cette infrastructure de bibliothèque, car elle a toujours été conçue de cette façon: chaque bibliothèque qui s'efforce de devenir populaire doit fournir une API asynchrone sinon elle ne sera pas utilisée.
la source
La raison principale en est probablement qu’elle utilise JavaScript pour écrire des composants côté serveur pour des éléments tels que des serveurs Web, des applications Web ou des services Web. Cela unifie le JavaScript JavaScript du langage de développement frontal traditionnel (côté client) avec le langage côté serveur.
Vous avez raison - le fait qu'il soit non bloquant, l'utilisation du schéma de réacteur ne soit pas unique - cela a déjà été fait avant d'utiliser d'autres langages et structures, comme Ruby's EventMachine ou Python's Twisted, par exemple.
la source
Les trois principales raisons que je donnerais sont:
Entrées / Sorties asynchrones non bloquantes. Ceci est haché partout sur le Web et dans les affiches précédentes. Une des choses à laquelle je contribuerais est que la conception de votre code pour assumer explicitement les comportements asynchrones aide le moteur du compilateur à optimiser le matériel. Oui, de nombreux compilateurs JIT et processeurs hyperthreading utilisent un code synchrone et aident à paralléliser l'exécution. Ceci est bien sûr une approche de meilleur effort. En revanche, si vous construisez explicitement l'application pour async io, vous vous assurez que le moteur et le matériel peuvent optimiser le temps d'exécution de votre code. Certes, je n'ai pas de données quantifiables pour le prouver, mais cela me fait chaud au cœur de penser de cette façon.
Base de code unique pour le client et le serveur. Cela présente un certain nombre d'avantages: aider à optimiser les coûts du centre de données en permettant de déplacer la logique métier du serveur vers le client; aider à réutiliser la logique métier / validation des données; réduire la complexité des compétences nécessaires aux développeurs pour prendre en charge le produit (par rapport à Python et javascript).
Faible barrière à l'entrée. À bien des égards, Javascirpt ressemble à Basic, Pascal et Perl d’année précédente. Il est très facile de commencer à écrire du code et ne nécessite pas beaucoup de connaissances de domaine pour commencer. Cela vous permet également de réduire vos coûts de développement en pouvant faire appel à plus de développeurs débutants et en accélérant la mise en place d'un projet. [Bien sûr, vous devez dépasser les idéologues qui croient que les langages de programmation devraient être difficiles pour éliminer les développeurs qui fonctionnent mal]
la source