Comment décider quand utiliser Node.js?

2195

Je suis nouveau à ce genre de choses, mais dernièrement je l' ai entendu beaucoup de choses sur la façon dont bon Node.js est. Étant donné combien j'aime travailler avec jQuery et JavaScript en général, je ne peux m'empêcher de me demander comment décider quand utiliser Node.js. L'application Web à laquelle je pense est quelque chose comme Bitly - prend du contenu, l'archive.

De tous les devoirs que j'ai faits ces derniers jours, j'ai obtenu les informations suivantes. Node.js

  • est un outil en ligne de commande qui peut être exécuté comme un serveur Web standard et permet d'exécuter des programmes JavaScript
  • utilise le grand moteur JavaScript V8
  • est très bon lorsque vous devez faire plusieurs choses en même temps
  • est basé sur des événements afin que toutes les merveilleuses choses de type Ajax puissent être faites côté serveur
  • nous permet de partager le code entre le navigateur et le backend
  • nous permet de parler avec MySQL

Certaines des sources que j'ai rencontrées sont:

Étant donné que Node.js peut être exécuté presque prêt à l'emploi sur les instances EC2 d'Amazon , j'essaie de comprendre quel type de problèmes nécessite Node.js par opposition à l'un des puissants rois comme PHP , Python et Ruby . Je comprends que cela dépend vraiment de l'expertise que l'on a sur une langue, mais ma question relève plus de la catégorie générale: quand utiliser un cadre particulier et à quel type de problèmes est-il particulièrement adapté?

Légende
la source
4
Cette question est en cours de discussion sur meta ( meta.stackoverflow.com/q/332386/497418 ).
zzzzBov

Réponses:

1355

Vous avez fait un excellent travail pour résumer ce qui est génial avec Node.js. Mon sentiment est que Node.js est particulièrement adapté aux applications où vous souhaitez maintenir une connexion persistante entre le navigateur et le serveur. En utilisant une technique connue sous le nom de "longue interrogation" , vous pouvez écrire une application qui envoie des mises à jour à l'utilisateur en temps réel. Faire de longs sondages sur de nombreux géants du Web, comme Ruby on Rails ou Django , créerait une charge énorme sur le serveur, car chaque client actif mange un processus serveur. Cette situation équivaut à une attaque tarpit . Lorsque vous utilisez quelque chose comme Node.js, le serveur n'a pas besoin de maintenir des threads séparés pour chaque connexion ouverte.

Cela signifie que vous pouvez créer une application de chat basée sur un navigateur dans Node.js qui ne nécessite presque aucune ressource système pour servir un grand nombre de clients. Chaque fois que vous souhaitez effectuer ce type d'interrogation longue, Node.js est une excellente option.

Il convient de mentionner que Ruby et Python ont tous deux des outils pour faire ce genre de chose ( eventmachine et twisted , respectivement), mais que Node.js le fait exceptionnellement bien, et à partir de zéro . JavaScript est exceptionnellement bien situé par rapport à un modèle de concurrence basé sur le rappel, et il excelle ici. De plus, pouvoir sérialiser et désérialiser avec JSON natif à la fois pour le client et le serveur est assez astucieux.

J'ai hâte de lire d'autres réponses ici, c'est une question fantastique.

Il convient de souligner que Node.js est également idéal pour les situations dans lesquelles vous réutiliserez beaucoup de code à travers l'écart client / serveur. Le framework Meteor rend cela très facile, et beaucoup de gens suggèrent que cela pourrait être l'avenir du développement web. Par expérience, je peux dire que c'est très amusant d'écrire du code dans Meteor, et une grande partie de cela passe moins de temps à réfléchir à la façon dont vous allez restructurer vos données, de sorte que le code qui s'exécute dans le navigateur peut facilement manipulez-le et renvoyez-le.

Voici un article sur Pyramid et long-polling, qui s'avère très facile à mettre en place avec un peu d'aide de gevent: TicTacToe et Long Polling with Pyramid .

Benson
la source
12
Oui, je pense qu'il est très important de penser que 'node.js est particulièrement adapté aux applications qui nécessitent une connexion persistante du navigateur au serveur. - tels que les programmes de chat ou les jeux interactifs 'Si l'on construit simplement une application qui n'a pas nécessairement besoin d'une communication utilisateur / serveur, le développement avec d'autres cadres serait très bien et prendra beaucoup moins de temps.
user482594
1
Merci pour cela ... Excellentes questions et réponses ;-) J'y penserais également en termes de maîtrise d'une excellente technologie pour le développement front-end et back-end sur plusieurs technologies différentes;)
Stokedout
12
Pourquoi utiliser un long sondage? Qu'est-il arrivé à l'avenir et aux prises ?
hitautodestruct
1
Ma réponse courte est le processus d'arrière-plan. La demande et la réponse (y compris l'API Rest) peuvent être réalisées avec n'importe quelle autre langue et serveur. Donc, pour ceux qui envisagent de convertir leurs projets Web en nœud. Détrompez-vous, c'est la même chose! Utilisez le nœud comme un processus d'arrière-plan comme la lecture d'e-mails avec imap, le traitement d'image, le téléchargement de fichiers dans le cloud ou tout processus long ou sans fin qui est principalement orienté événement ...
Vikas
409

Je pense que Node.js est le mieux adapté aux applications en temps réel: jeux en ligne, outils de collaboration, salles de discussion ou tout ce que fait un utilisateur (ou robot? Ou capteur?) Avec l'application doit être vu par les autres utilisateurs immédiatement, sans actualisation de page.

Je dois également mentionner que Socket.IO en combinaison avec Node.js réduira encore plus votre latence en temps réel que ce qui est possible avec une longue interrogation. Socket.IO retombera dans l'interrogation longue dans le pire des cas, et utilisera à la place des sockets Web ou même Flash s'ils sont disponibles.

Mais je dois également mentionner que presque toutes les situations où le code pourrait se bloquer en raison de threads peuvent être mieux traitées avec Node.js. Ou toute situation où vous avez besoin que l'application soit pilotée par les événements.

En outre, Ryan Dahl a déclaré lors d'une conférence à laquelle j'ai assisté une fois que les benchmarks Node.js rivalisaient étroitement avec Nginx pour les anciennes requêtes HTTP régulières. Donc, si nous construisons avec Node.js, nous pouvons servir nos ressources normales de manière assez efficace, et lorsque nous avons besoin de choses événementielles, il est prêt à les gérer.

De plus, c'est tout JavaScript tout le temps. Lingua Franca sur toute la pile.

fisherwebdev
la source
17
Juste une observation de quelqu'un qui bascule entre .Net et Node, Les différentes langues pour différentes zones du système aident beaucoup lors du changement de contexte. Quand je regarde Javascript, je travaille dans le client, C # signifie le serveur d'applications, SQL = base de données. Travaillant en Javascript tout au long, je me suis retrouvé à confondre les couches ou à prendre plus de temps pour changer de contexte. Il s'agit probablement d'un artefact de travail sur la pile .NET toute la journée et de nodage la nuit, mais cela fait une différence.
Michael Blackburn
9
Fait intéressant, la pratique selon laquelle les individus transculturels changent de dialecte lorsqu'ils se déplacent entre les cultures traditionnelles et indigènes est appelée «changement de code».
Michael Blackburn,
1
L'autre jour, je réfléchissais à la façon dont je pourrais attribuer différentes couleurs à mes différents .jsfichiers. Vert pour le côté client, bleu pour le côté serveur. Je continue de me "perdre".
AJB
209

Raisons d'utiliser NodeJS:

  • Il exécute Javascript, vous pouvez donc utiliser le même langage sur le serveur et le client, et même partager du code entre eux (par exemple pour la validation de formulaire, ou pour afficher des vues à chaque extrémité.)

  • Le système piloté par événements à un seul thread est rapide même lors du traitement de nombreuses demandes à la fois, et également simple, par rapport aux frameworks Java ou ROR multi-threads traditionnels .

  • Le pool sans cesse croissant de packages accessibles via NPM , y compris les bibliothèques / modules côté client et serveur, ainsi que les outils de ligne de commande pour le développement Web. La plupart d'entre eux sont commodément hébergés sur github, où parfois vous pouvez signaler un problème et le résoudre en quelques heures! C'est agréable de tout avoir sous un même toit, avec un rapport de problème standardisé et un forking facile.

  • Il est devenu l'environnement standard de facto dans lequel exécuter des outils liés à Javascript et d'autres outils liés au Web , y compris des exécuteurs de tâches, des minificateurs, des embellisseurs, des linters, des préprocesseurs, des bundlers et des processeurs d'analyse.

  • Il semble tout à fait adapté au prototypage, au développement agile et à l'itération rapide des produits .

Raisons de ne pas utiliser NodeJS:

  • Il exécute Javascript, qui n'a pas de vérification de type à la compilation. Pour les grands systèmes complexes et critiques pour la sécurité , ou les projets comprenant la collaboration entre différentes organisations, un langage qui encourage les interfaces contractuelles et fournit une vérification de type statique peut vous faire économiser du temps de débogage (et des explosions ) à long terme. (Bien que la JVM soit bloquée null, veuillez utiliser Haskell pour vos réacteurs nucléaires.)

  • De plus, la plupart des packages de NPM sont un peu bruts et toujours en développement rapide. Certaines bibliothèques d'anciens frameworks ont subi une décennie de tests et de corrections de bugs et sont très stables à l'heure actuelle. Npmjs.org n'a pas de mécanisme pour évaluer les packages , ce qui a conduit à une prolifération de packages faisant plus ou moins la même chose, dont un grand pourcentage n'est plus maintenu.

  • Enfer de rappel imbriqué. (Bien sûr, il existe 20 solutions différentes à cela ...)

  • Le pool sans cesse croissant de packages peut faire apparaître un projet NodeJS radicalement différent du suivant. Il existe une grande diversité d'implémentations en raison du grand nombre d'options disponibles (par exemple Express / Sails.js / Meteor / Derby ). Cela peut parfois rendre plus difficile pour un nouveau développeur de se lancer dans un projet Node. Comparez cela avec un développeur Rails qui rejoint un projet existant: il devrait pouvoir se familiariser assez rapidement avec l'application, car toutes les applications Rails sont encouragées à utiliser une structure similaire .

  • Le traitement des fichiers peut être un peu pénible. Les choses triviales dans d'autres langues, comme lire une ligne d'un fichier texte, sont assez étranges pour faire avec Node.js qu'il y a une question StackOverflow à ce sujet avec plus de 80 votes positifs. Il n'y a pas de moyen simple de lire un enregistrement à la fois à partir d'un fichier CSV . Etc.

J'adore NodeJS, il est rapide, sauvage et amusant, mais je crains qu'il ne s'intéresse pas à la justesse prouvable. Espérons que nous pourrons éventuellement fusionner le meilleur des deux mondes. J'ai hâte de voir ce qui remplacera Node à l'avenir ... :)

joeytwiddle
la source
1
@nane Oui, je pense qu'ils peuvent résoudre ce problème, mais vous devez alors vous limiter à n'utiliser que des bibliothèques écrites dans des langages sécurisés, ou accepter que toute votre base de code ne soit pas typée statiquement. Mais un argument va: puisque vous devez écrire de bons tests pour votre code indépendamment de la langue, alors votre niveau de confiance doit être égal même pour du code typé dynamiquement. Si nous acceptons cet argument, les avantages d'un typage fort sont réduits à aider au temps de développement / débogage, à la prouvabilité et à l' optimisation .
joeytwiddle
1
@kervin, je suis d'accord sur le fait que certaines références seraient formidables, mais j'ai été déçu de ce que j'ai pu trouver en ligne. Certains ont fait valoir que les performances .NET sont comparables à celles de Node, mais que ce que vous faites réellement est essentiel. Le nœud peut être excellent pour délivrer de petits messages avec de nombreuses connexions simultanées, mais pas si bien pour les calculs mathématiques lourds. Une bonne comparaison des performances devrait tester une variété de situations.
joeytwiddle
2
@joeytwiddle des choses comme Typescript ne pourraient-elles pas aider Node.js en ce qui concerne la gestion de programmes complexes plus importants et le contrôle de typage statique?
CodeMonkey
2
@joeytwiddle pour ce que cela vaut, vous pouvez utiliser stillmaintained.com pour déterminer si un paquet npm est toujours maintenu (car la plupart sont sur github). En outre, npm searchet npm showvous montrera la date de la dernière version d'un package.
Dan Pantry
3
En comparant les rails au nœud, vous confondez une plate-forme avec un framework. Rails est un framework pour Ruby tout comme Sails et meteor sont des frameworks pour Javascript.
BonsaiOak
206

Pour faire court:

Node.js est bien adapté aux applications qui ont beaucoup de connexions simultanées et chaque requête ne nécessite que très peu de cycles CPU, car la boucle d'événement (avec tous les autres clients) est bloquée lors de l'exécution d'une fonction.

Un bon article sur la boucle d'événement dans Node.js est le blog tech de Mixu: Comprendre la boucle d'événements Node.js .

stewe
la source
127

J'ai un exemple du monde réel où j'ai utilisé Node.js. L'entreprise où je travaille a trouvé un client qui voulait avoir un simple site Web HTML statique. Ce site Web est destiné à la vente d'un article à l'aide de PayPal et le client souhaitait également disposer d'un compteur indiquant le nombre d'articles vendus. Le client devrait avoir une énorme quantité de visiteurs sur ce site Web. J'ai décidé de faire le compteur en utilisant Node.js et le framework Express.js .

L'application Node.js était simple. Obtenez le montant des articles vendus à partir d'une base de données Redis , augmentez le compteur lorsque l'article est vendu et servez la valeur du compteur aux utilisateurs via l' API .

Quelques raisons pour lesquelles j'ai choisi d'utiliser Node.js dans ce cas

  1. Il est très léger et rapide. Il y a eu plus de 200 000 visites sur ce site Web en trois semaines et les ressources minimales du serveur ont pu tout gérer.
  2. Le compteur est vraiment facile à faire pour être en temps réel.
  3. Node.js était facile à configurer.
  4. De nombreux modules sont disponibles gratuitement. Par exemple, j'ai trouvé un module Node.js pour PayPal.

Dans ce cas, Node.js était un choix génial.

Joonas
la source
7
Comment hébergez-vous quelque chose comme ça? Devez-vous alors configurer nodejs sur le serveur de production? Sous Linux?
Miguel Stevens
1
Il existe quelques PaaS tels que nodejitsu et Heroku. Ou vous pouvez en effet mettre en place nodejs sur une box linux c'est à dire depuis amazon ec2. voir: lauradhamilton.com/…
harry young
13
200 000 visites en 1 814 400 secondes. Pas du tout pertinent. Même bash pourrait servir autant de requêtes, sur le serveur le plus lent. Serveur Scratch. VM la plus lente.
Tiberiu-Ionuț Stan
105

Les raisons les plus importantes pour démarrer votre prochain projet en utilisant Node ...

  • Tous les mecs les plus cool sont dedans ... donc ça doit être amusant.
  • Vous pouvez passer du temps à la glacière et avoir de nombreuses aventures Node à vous vanter.
  • Vous êtes un penny penny quand il s'agit de coûts d'hébergement cloud.
  • J'y suis allé avec Rails
  • Vous détestez les déploiements IIS
  • Votre ancien travail informatique devient plutôt ennuyeux et vous souhaitez être dans une nouvelle Start Up brillante.

À quoi s'attendre ...

  • Vous vous sentirez en sécurité avec Express sans tous les logiciels de serveur dont vous n'avez jamais eu besoin.
  • Fonctionne comme une fusée et évolue bien.
  • Vous en rêvez. Vous l'avez installé. Le package de nœuds repo npmjs.org est le plus grand écosystème de bibliothèques open source au monde.
  • Votre cerveau aura du temps déformé au pays des rappels imbriqués ...
  • ... jusqu'à ce que vous appreniez à tenir vos promesses .
  • Sequelize et passeport sont vos nouveaux amis API.
  • Le débogage, principalement du code asynchrone, deviendra umm ... intéressant .
  • Il est temps pour tous les Noders de maîtriser TypeScript .

Qui l'utilise?

  • PayPal, Netflix, Walmart, LinkedIn, Groupon, Uber, GoDaddy, Dow Jones
  • Voici pourquoi ils sont passés à Node .
Tony O'Hagan
la source
18
Oui, j'aurais pu répondre à cette question de manière traditionnelle. Je pense que je suis qualifié pour le faire, mais la plupart des choses ont déjà été dites et je pensais qu'un amusement léger briserait la monotonie. Je contribue régulièrement à des réponses techniques sur d'autres questions.
Tony O'Hagan
1
les rappels imbriqués peuvent être évités en utilisant des générateurs ES6 pour le code asynchrone
refactor
1
@CleanCrispCode: Oui en effet! ES6 a adopté le style C # async/ awaitmaintenant nous pouvons déployer un code de nœud asynchrone beaucoup plus propre qui prend également en charge le traditionnel try/ catch. En 2016/17, les codeurs JS passent à ES6.
Tony O'Hagan
1
dix mille fois ceci "Vous vous sentirez en sécurité avec Express sans tout le bloatware de serveur dont vous n'avez jamais eu besoin"
Simone Poggi
60

Rien de tel que Silver Bullet. Tout vient avec un certain coût qui lui est associé. C'est comme si vous mangez des aliments gras, vous compromettez votre santé et les aliments sains ne viennent pas avec des épices comme les aliments gras. C'est un choix individuel s'ils veulent de la santé ou des épices comme dans leur nourriture. De même, Node.js considère être utilisé dans un scénario spécifique. Si votre application ne correspond pas à ce scénario, vous ne devez pas la prendre en compte pour le développement de votre application. Je mets juste ma pensée sur le même:

Quand utiliser Node.JS

  1. Si votre code côté serveur nécessite très peu de cycles de processeur. Dans un autre monde, vous effectuez une opération non bloquante et n'avez pas d'algorithme / travail lourd qui consomme beaucoup de cycles CPU.
  2. Si vous venez de l'arrière-plan Javascript et que vous êtes à l'aise pour écrire du code Single Threaded, tout comme le côté client JS.

Quand NE PAS utiliser Node.JS

  1. Votre demande de serveur dépend d'un algorithme / travail consommant beaucoup de CPU.

Considérations d'évolutivité avec Node.JS

  1. Node.JS lui-même n'utilise pas tous les cœurs du système sous-jacent et il est un thread unique par défaut, vous devez écrire la logique par vous-même pour utiliser le processeur multicœur et le rendre multi-thread.

Alternatives à Node.JS

Il existe d'autres options à utiliser à la place de Node.JS, mais Vert.x semble être assez prometteur et possède de nombreuses fonctionnalités supplémentaires comme le polygot et de meilleures considérations d'évolutivité.

Ajay Tiwari
la source
24
Je ne suis pas sûr que "Si votre demande côté serveur inclut des opérations de blocage comme File IO ou Socket IO" dans "Quand ne pas utiliser". Si ma compréhension est bonne, l'un des points forts du node.js est qu'il dispose de puissants moyens asynchrone pour gérer les E / S sans bloquer. Node.js peut donc être considéré comme un «remède» pour bloquer les E / S.
Ondrej Peterka,
3
@OndraPeterka: Vous avez raison de dire que Node.js est capable de bloquer les E / S du serveur, mais si votre gestionnaire de demande sur le serveur lui-même effectue un appel de blocage à un autre service Web / opération de fichier, Node.js n'aidera pas ici. Il ne bloque pas les E / S uniquement pour les demandes entrantes vers le serveur, mais pas pour les demandes sortantes de votre gestionnaire de demandes d'application.
Ajay Tiwari
4
@ajay de nodejs.org ils disent "E / S non bloquantes", veuillez vérifier vos "Quand NON" 2 et 3.
Omar Al-Ithawi
5
avec la version actuelle, le nœud prend en charge la prise en charge multicœur en utilisant le cluster. Cela améliore vraiment les performances de l'application Node au moins deux fois. Cependant, je pense que les performances devraient être plus de deux fois lorsqu'elles stabilisent le cluster lib.
Nam Nguyen
4
Vous pouvez utiliser node.js pour des calculs lourds. Utilisez fork. Voir stackoverflow.com/questions/9546225/… . Le nœud gère très bien plusieurs cœurs avec le clustermodule. nodejs.org/api/cluster.html
Jess
41

Une autre grande chose que je pense que personne n'a mentionnée à propos de Node.js est la communauté incroyable, le système de gestion des packages (npm) et la quantité de modules qui existent que vous pouvez inclure en les incluant simplement dans votre fichier package.json.

BoxerBucks
la source
6
Et ces packages sont tous relativement récents, ils ont donc l'avantage du recul et ont tendance à se conformer aux normes Web récentes.
joeytwiddle
3
Avec tout le respect que je vous dois , beaucoup de packages sur npm sont terribles, car npm n'a pas de mécanisme pour évaluer les packages . Rétrospective du CPAN, quelqu'un?
Dan Dascalescu
dommage qu'aucune des bibliothèques websockets ne puisse satisfaire aux spécifications rfc 6455. Les fanboys de node.js sont sourds, muets et aveugles quand ce fait est donné.
r3wt
1
Je ne sais pas quand vous avez fait le commentaire, mais pour l'instant la bibliothèque ws prend en charge cette spécification
Jonathan Gray
37

Mon article: nodejs est idéal pour créer des systèmes en temps réel comme l'analytique, les applications de chat, les API, les serveurs publicitaires, etc.

Éditer

Cela fait plusieurs années que j'ai commencé à utiliser nodejs et je l'ai utilisé pour créer de nombreuses choses différentes, y compris des serveurs de fichiers statiques, des analyses simples, des applications de chat et bien plus encore. Ceci est mon point de vue sur l'utilisation de nodejs

Quand utiliser

Lors de la création d'un système qui met l'accent sur la concurrence et la vitesse.

  • Prend en charge uniquement les serveurs tels que les applications de chat, les applications irc, etc.
  • Réseaux sociaux qui mettent l'accent sur les ressources en temps réel comme la géolocalisation, le flux vidéo, le flux audio, etc.
  • Gérer de petits morceaux de données très rapidement comme une webapp analytique.
  • Comme exposant un api REST uniquement.

Quand ne pas utiliser

C'est un serveur Web très polyvalent, vous pouvez donc l'utiliser où vous voulez, mais probablement pas dans ces endroits.

  • Blogs simples et sites statiques.
  • Tout comme un serveur de fichiers statique.

Gardez à l'esprit que je ne fais que piqûre. Pour les serveurs de fichiers statiques, apache est préférable, principalement parce qu'il est largement disponible. La communauté nodejs est devenue plus grande et plus mature au fil des ans et il est sûr de dire que nodejs peut être utilisé à peu près partout si vous avez votre propre choix d'hébergement.

shash7
la source
Les blogs simples peuvent toujours bénéficier de Node.js. Pour servir des fichiers statiques, vous pouvez toujours utiliser Node.js et si la charge augmente, ajoutez simplement le proxy inverse Nginx devant, conformément aux meilleures pratiques actuelles. Le serveur Apache httpd est un dinosaure en train de mourir - voir cette enquête Netcraft .
Endrju
Je dirais le contraire - jetez un œil à ghost.org , il a l'air incroyable et est construit sur NodeJs - collaboration, édition d'articles en temps réel. En outre, la création d'une page simple dans NodeJs, par exemple en utilisant sailsjs.org , est facile, rapide et vous n'avez pas à vous soucier de l'apprentissage des langages de programmation côté serveur
Bery
30

Il peut être utilisé là où

  • Applications fortement pilotées par les événements et fortement liées aux E / S
  • Applications gérant un grand nombre de connexions à d'autres systèmes
  • Applications en temps réel (Node.js a été conçu dès le départ pour le temps réel et pour être facile à utiliser.)
  • Applications qui jonglent avec des masses d'informations en streaming vers et depuis d'autres sources
  • Trafic élevé, applications évolutives
  • Applications mobiles qui doivent parler à la plateforme API et à la base de données, sans avoir à faire beaucoup d'analyses de données
  • Créer des applications en réseau
  • Les applications qui doivent parler très souvent avec le back-end

Sur le front mobile, les entreprises en prime time se sont appuyées sur Node.js pour leurs solutions mobiles. Découvrez pourquoi?

LinkedIn est un utilisateur important. L'intégralité de leur pile mobile est construite sur Node.js. Ils sont passés de 15 serveurs avec 15 instances sur chaque machine physique à seulement 4 instances, ce qui peut gérer le double du trafic!

eBay a lancé ql.io, un langage de requête Web pour les API HTTP, qui utilise Node.js comme pile d'exécution. Ils ont pu régler une station de travail Ubuntu régulière de qualité développeur pour gérer plus de 120 000 connexions actives par processus node.js, chaque connexion consommant environ 2 Ko de mémoire!

Walmart a repensé son application mobile pour utiliser Node.js et a poussé son traitement JavaScript vers le serveur.

En savoir plus sur: http://www.pixelatingbits.com/a-closer-look-at-mobile-app-development-with-node-js/

Vinayak Bevinakatti
la source
20

Nœud idéal pour le traitement simultané des demandes -

Commençons donc par une histoire. Depuis 2 ans, je travaille sur JavaScript et développe le front-end web et je l'apprécie. Les gars du back-end nous fournissent des API écrites en Java, en python (peu nous importe) et nous écrivons simplement un appel AJAX, récupérons nos données et devinez quoi! nous avons fini. Mais en réalité, ce n'est pas si simple, si les données que nous obtenons ne sont pas correctes ou s'il y a une erreur de serveur, nous sommes bloqués et nous devons contacter nos back-end par mail ou chat (parfois sur WhatsApp aussi :)). n'est pas cool. Et si nous écrivions nos API en JavaScript et appelions ces API depuis notre serveur frontal? Oui, c'est plutôt cool parce que si nous rencontrons un problème dans l'API, nous pouvons l'examiner. Devine quoi ! vous pouvez le faire maintenant, comment? - Node est là pour vous.

D'accord, vous pouvez écrire votre API en JavaScript, mais que faire si je suis d'accord avec le problème ci-dessus. Avez-vous une autre raison d'utiliser l'API node for rest?

voici donc la magie commence. Oui, j'ai d'autres raisons d'utiliser le nœud pour nos API.

Revenons à notre système API de repos traditionnel qui est basé sur une opération de blocage ou un thread. Supposons que deux demandes simultanées se produisent (r1 et r2), chacune d'entre elles nécessite une opération de base de données. Donc, dans le système traditionnel, ce qui se passera:

1. Attente: Notre serveur commence à servir la r1demande et attend la réponse à la requête. après la fin de r1, le serveur commence à servir r2et le fait de la même manière. Attendre n'est donc pas une bonne idée car nous n'avons pas beaucoup de temps.

2. Threading Way: Notre serveur créera deux threads pour les deux requêtes r1et r2remplira leur fonction après avoir interrogé la base de données, donc refroidissez-la rapidement. alors vous devez faire face à des problèmes de type impasse. Donc, c'est mieux que d'attendre, mais des problèmes persistent.

Maintenant, voici comment le nœud va le faire:

3. Nodeway: lorsque la même demande simultanée arrive dans le nœud, il enregistre un événement avec son rappel et avance, il n'attendra pas la réponse à la requête pour une r1demande particulière . dans le nœud qui remplit cette fonction.) enregistrer un événement avec sa fonction de rappel et aller de l'avant pour la r2demande de service et enregistrer de manière similaire son événement avec son rappel. Chaque fois qu'une requête se termine, elle déclenche son événement correspondant et exécute son rappel jusqu'à la fin sans être interrompue.

Donc pas d'attente, pas de thread, pas de consommation de mémoire - oui, c'est nodeway pour servir l'API de repos.

Anshul
la source
1
Salut Anshul. Pouvez-vous élaborer ou suggérer des ressources sur la façon dont un blocage peut se produire de la manière d'un filetage.
jsbisht
16

Ma dernière raison de choisir Node.js pour un nouveau projet est:

Être capable de faire du développement basé sur le cloud pur

J'utilise Cloud9 IDE depuis un certain temps et maintenant je ne peux pas m'imaginer sans, il couvre tous les cycles de vie du développement. Tout ce dont vous avez besoin est un navigateur et vous pouvez coder à tout moment et n'importe où sur n'importe quel appareil. Vous n'avez pas besoin d'archiver le code sur un ordinateur (comme à la maison), puis de payer sur un autre ordinateur (comme au travail).

Bien sûr, il peut y avoir un IDE basé sur le cloud pour d'autres langues ou plates-formes (Cloud 9 IDE ajoute également des supports pour d'autres langues), mais utiliser Cloud 9 pour faire le développement de Node.js est vraiment une grande expérience pour moi.

Sean Zhao
la source
1
En fait, Cloud9 IDE et les autres (koding celui que j'utilise) prennent en charge presque tous les types de langage Web.
Wanny Miarelli
7
Êtes-vous un mec sérieux? ce sont les critères de choix d'une pile? :) heureux que ça marche pour vous!
matanster
15

Une autre chose que le nœud offre est la possibilité de créer plusieurs instants v8 de nœud en utilisant le processus enfant du nœud ( childProcess.fork () nécessitant chacun 10 Mo de mémoire selon les documents) à la volée, n'affectant donc pas le processus principal exécutant le serveur. Ainsi, décharger un travail d'arrière-plan qui nécessite une énorme charge de serveur devient un jeu d'enfant et nous pouvons facilement les tuer au fur et à mesure des besoins.

J'ai beaucoup utilisé le nœud et dans la plupart des applications que nous construisons, nécessitent en même temps des connexions de serveur, donc un trafic réseau important. Des cadres comme Express.js et les nouveaux Koajs (qui ont supprimé l'enfer de rappel) ont rendu le travail sur le nœud encore plus facile.

I_Debug_Everything
la source
15

Enfiler des longjohns en amiante ...

Hier, mon titre avec Packt Publications, Programmation réactive avec JavaScript . Ce n'est pas vraiment un titre centré sur Node.js; les premiers chapitres sont destinés à couvrir la théorie, et les chapitres ultérieurs à code élevé couvrent la pratique. Parce que je ne pensais pas vraiment qu'il serait approprié de ne pas donner aux lecteurs un serveur Web, Node.js semblait de loin le choix évident. L'affaire a été classée avant même son ouverture.

J'aurais pu donner une vue très positive de mon expérience avec Node.js. Au lieu de cela, j'étais honnête au sujet des bons et des mauvais points que j'ai rencontrés.

Permettez-moi d'inclure quelques citations pertinentes ici:

Attention: Node.js et son écosystème sont chauds - assez chaud pour vous brûler gravement!

Lorsque j'étais assistant enseignant en mathématiques, l'une des suggestions non évidentes qui m'avaient été suggérées était de ne pas dire à un étudiant que quelque chose était «facile». La raison était quelque peu évidente rétrospectivement: si vous dites aux gens que quelque chose est facile, quelqu'un qui ne voit pas de solution peut finir par se sentir (encore plus) stupide, car non seulement ils ne savent pas comment résoudre le problème, mais le problème ils sont trop stupides pour comprendre que c'est facile!

Il y a des pièges qui n'ennuient pas seulement les gens venant de Python / Django, qui rechargent immédiatement la source si vous changez quelque chose. Avec Node.js, le comportement par défaut est que si vous apportez une modification, l'ancienne version continue d'être active jusqu'à la fin des temps ou jusqu'à ce que vous arrêtiez et redémarriez manuellement le serveur. Ce comportement inapproprié ne dérange pas seulement les Pythonistas; cela irrite également les utilisateurs natifs de Node.js qui proposent diverses solutions de contournement. La question StackOverflow «Rechargement automatique des fichiers dans Node.js» a, au moment de la rédaction de ce document, plus de 200 votes positifs et 19 réponses; une modification dirige l'utilisateur vers un script de nounou, node-supervisor, avec une page d'accueil à http://tinyurl.com/reactjs-node-supervisor. Ce problème offre aux nouveaux utilisateurs une grande opportunité de se sentir stupides car ils pensaient avoir résolu le problème, mais l'ancien comportement buggé est complètement inchangé. Et il est facile d'oublier de faire rebondir le serveur; Je l'ai fait plusieurs fois. Et le message que je voudrais donner est: «Non, vous n'êtes pas stupide parce que ce comportement de Node.js vous a mordu le dos; c'est juste que les concepteurs de Node.js n'ont vu aucune raison de fournir un comportement approprié ici. Essayez d'y faire face, peut-être en prenant un peu d'aide du superviseur de noeud ou d'une autre solution, mais s'il vous plaît ne vous éloignez pas en vous sentant stupide. Ce n'est pas vous qui avez le problème; le problème est dans le comportement par défaut de Node.js. "

Cette section, après un débat, a été laissée, précisément parce que je ne veux pas donner une impression de «c'est facile». Je me suis coupé les mains à plusieurs reprises tout en faisant fonctionner les choses, et je ne veux pas atténuer les difficultés et vous faire croire que le bon fonctionnement de Node.js et de son écosystème est une question simple et si ce n'est pas simple pour vous aussi , vous ne savez pas ce que vous faites. Si vous ne rencontrez pas de difficultés odieuses en utilisant Node.js, c'est merveilleux. Si vous le faites, j'espère que vous ne vous en éloignerez pas en vous disant: "Je suis stupide - il doit y avoir quelque chose qui ne va pas avec moi." Vous n'êtes pas stupide si vous rencontrez de mauvaises surprises face à Node.js. Ce n'est pas toi! C'est Node.js et son écosystème!

L'annexe, que je ne voulais pas vraiment après la montée du crescendo dans les derniers chapitres et la conclusion, parle de ce que j'ai pu trouver dans l'écosystème et a fourni une solution de contournement au littéralisme débile:

Une autre base de données qui semblait être un ajustement parfait, et qui peut encore être utilisée, est une implémentation côté serveur du magasin de valeurs-clés HTML5. Cette approche a l'avantage cardinal d'une API que la plupart des bons développeurs frontaux comprennent assez bien. D'ailleurs, c'est aussi une API que la plupart des développeurs frontaux pas si bons comprennent assez bien. Mais avec le package node-localstorage, bien que l'accès à la syntaxe du dictionnaire ne soit pas proposé (vous voulez utiliser localStorage.setItem (clé, valeur) ou localStorage.getItem (clé), pas localStorage [clé]), la sémantique localeStorage complète est implémentée , y compris un quota de 5 Mo par défaut - POURQUOI?Les développeurs JavaScript côté serveur doivent-ils être protégés d'eux-mêmes?

Pour les capacités de base de données côté client, un quota de 5 Mo par site Web est vraiment une marge de manœuvre généreuse et utile pour permettre aux développeurs de travailler avec. Vous pouvez définir un quota beaucoup plus bas et offrir aux développeurs une amélioration incommensurable par rapport à la boiterie avec la gestion des cookies. Une limite de 5 Mo ne se prête pas très rapidement au traitement côté client Big Data, mais il y a une allocation vraiment assez généreuse que les développeurs ingénieux peuvent utiliser pour faire beaucoup. Mais d'un autre côté, 5 Mo ne représentent pas une part particulièrement importante de la plupart des disques achetés récemment, ce qui signifie que si vous et un site Web êtes en désaccord sur l'utilisation raisonnable de l'espace disque, ou si un site est tout simplement lourd, cela ne coûte pas vraiment vous beaucoup et vous n'êtes pas en danger d'un disque dur submergé à moins que votre disque dur était déjà trop plein.

Cependant, il peut être doucement souligné que lorsque vous êtes le seul à écrire du code pour votre serveur, vous n'avez pas besoin de protection supplémentaire contre la taille de votre base de données supérieure à 5 Mo tolérable. La plupart des développeurs n'auront ni besoin ni envie d'outils agissant comme un nounou et les protégeant du stockage de plus de 5 Mo de données côté serveur. Et le quota de 5 Mo qui est un acte d'équilibrage d'or côté client est plutôt stupide sur un serveur Node.js. (Et, pour une base de données pour plusieurs utilisateurs telle que celle couverte dans cette annexe, il peut être souligné, légèrement douloureusement, que ce n'est pas 5 Mo par compte d'utilisateur, sauf si vous créez une base de données distincte sur le disque pour chaque compte d'utilisateur; c'est 5 Mo partagés entre tous les comptes d'utilisateurs ensemble. Cela pourrait douloureuxsi vous devenez viral!) La documentation indique que le quota est personnalisable, mais un e-mail il y a une semaine au développeur demandant comment changer le quota est sans réponse, tout comme la question de StackOverflow le demandant. La seule réponse que j'ai pu trouver est dans la source Github CoffeeScript, où il est répertorié comme un deuxième argument entier facultatif pour un constructeur. C'est donc assez simple, et vous pouvez spécifier un quota égal à la taille d'un disque ou d'une partition. Mais en plus de porter une fonctionnalité qui n'a pas de sens, l'auteur de l'outil n'a pas complètement suivi une convention très standard d'interprétation de 0 comme signifiant «illimité» pour une variable ou une fonction où un entier doit spécifier une limite maximale pour une certaine utilisation des ressources. La meilleure chose à faire avec cette erreur est probablement de spécifier que le quota est Infinity:

if (typeof localStorage === 'undefined' || localStorage === null)
  {      
  var LocalStorage = require('node-localstorage').LocalStorage;
  localStorage = new LocalStorage(__dirname + '/localStorage',
    Infinity);
  }

Échanger deux commentaires dans l'ordre:

Les gens se sont inutilement tirés dans le pied en utilisant constamment JavaScript dans son ensemble, et une partie du langage JavaScript étant respectable était un Douglas Crockford disant en substance: «JavaScript en tant que langage a de très bonnes et de très mauvaises parties. Voici les bonnes parties. Oubliez juste que tout le reste est là. » Peut-être que l'écosystème chaud de Node.js développera son propre «Douglas Crockford», qui dira: «L'écosystème de Node.js est un Far West codant, mais il y a de vrais joyaux à trouver. Voici une feuille de route. Voici les domaines à éviter à tout prix. Voici les zones avec certains des plus riches chèques de paie que l'on puisse trouver dans N'IMPORTE QUELLE langue ou environnement. »

Peut-être que quelqu'un d'autre peut prendre ces mots comme un défi, suivre l'exemple de Crockford et rédiger «les bonnes parties» et / ou «les meilleures parties» pour Node.js et son écosystème. J'achèterais une copie!

Et compte tenu du degré d'enthousiasme et des heures de travail sur tous les projets, il peut être justifié dans un an, deux ou trois, de tempérer fortement toutes les remarques sur un écosystème immature faites au moment de la rédaction de cet article. Cela peut vraiment avoir du sens dans cinq ans de dire: «L'écosystème Node.js 2015 avait plusieurs champs de mines. L'écosystème 2020 Node.js a plusieurs paradis. »

Christos Hayward
la source
9

Si votre application attache principalement des API Web ou d'autres canaux io, donne ou prend une interface utilisateur, node.js peut être un choix judicieux pour vous, surtout si vous souhaitez tirer le meilleur parti de l'évolutivité, ou, si votre langue principale dans la vie est javascript (ou transpilers javascript de toutes sortes). Si vous créez des microservices, node.js est également correct. Node.js convient également à tout projet petit ou simple.

Son principal argument de vente est qu'il permet aux front-enders d'assumer la responsabilité des trucs back-end plutôt que de la division typique. Un autre argument de vente justifiable est de savoir si votre main-d'œuvre est orientée javascript pour commencer.

Au-delà d'un certain point cependant, vous ne pouvez pas faire évoluer votre code sans de terribles hacks pour forcer la modularité, la lisibilité et le contrôle de flux. Cependant, certaines personnes aiment ces hacks, provenant en particulier d'un arrière-plan javascript événementiel, elles semblent familières ou pardonnables.

En particulier, lorsque votre application doit effectuer des flux synchrones, vous commencez à saigner sur des solutions semi-cuites qui vous ralentissent considérablement en termes de processus de développement. Si vous avez des pièces à calcul intensif dans votre application, marchez avec prudence en choisissant (uniquement) node.js. Peut-être que http://koajs.com/ ou d'autres nouveautés atténuent ces aspects à l'origine épineux, par rapport à quand j'ai utilisé node.js à l'origine ou écrit ceci.

matanster
la source
3
Il existe de nombreuses approches existantes pour la mise à l'échelle des applications Node.js, et vous ne semblez pas fournir de références concernant les revendications "solutions semi-cuites", "terribles hacks" et "terribles API". Ça vous dérange de les développer?
Sven Slootweg
Je laisse cela comme un exercice au lecteur, mais il suffit de regarder les soi-disant solutions de contrôle de flux.
matanster
2
Ce n'est pas vraiment une réponse. Vous prétendez que les solutions existantes sont des «piratages terribles», mais ne parlez d’aucune d’elles. Avez-vous pensé que vous pourriez tout simplement ne pas comprendre ou être au courant des méthodes correctes pour faire évoluer les applications Node.js?
Sven Slootweg
J'ai un peu mis à jour ma réponse. Peut-être avez-vous encore des plaintes, mais si vous pensez que c'est faux, vous devriez commenter avec des détails ... plutôt que de signaler un manque de réponse. Ce serait plus productif pour la communauté imo.
matanster
-2

Je peux partager quelques points où et pourquoi utiliser le nœud js.

  1. Pour les applications en temps réel telles que le chat, l'édition collaborative, nous allons mieux avec nodejs car il s'agit d'une base d'événements qui déclenche des événements et des données vers les clients à partir du serveur.
  2. Simple et facile à comprendre car c'est une base javascript où la plupart des gens ont une idée.
  3. La plupart des applications Web actuelles allant vers le js angulaire et le backbone, avec le nœud, il est facile d'interagir avec le code côté client car les deux utiliseront les données json.
  4. Beaucoup de plugins disponibles.

Désavantages:-

  1. Le nœud prendra en charge la plupart des bases de données, mais le mieux est mongodb qui ne prendra pas en charge les jointures complexes et autres.
  2. Erreurs de compilation ... le développeur doit gérer toutes les exceptions autrement si une application d'accord d'erreur cesse de fonctionner là où nous devons à nouveau la démarrer manuellement ou utiliser un outil d'automatisation.

Conclusion: - Nodejs est préférable d'utiliser pour des applications simples et en temps réel. Si vous souhaitez créer une application avec le chat et toute fonctionnalité collaborative .. le nœud peut être utilisé dans des parties spécifiques et rester doit aller avec votre technologie de confort.

BEJGAM SHIVA PRASAD
la source
-3
  1. Le nœud est idéal pour les prototypes rapides, mais je ne l'utiliserais plus jamais pour quelque chose de complexe. J'ai passé 20 ans à développer une relation avec un compilateur et ça me manque vraiment.

  2. Node est particulièrement pénible pour maintenir le code que vous n'avez pas visité depuis un certain temps. Les informations de type et la détection d'erreur de compilation sont de BONNES CHOSES. Pourquoi jeter tout ça? Pour quoi? Et dang, quand quelque chose va vers le sud, la pile trace assez souvent complètement inutile.

mbert65
la source
2
Bien que vous n'obteniez pas de vérification au moment de la compilation, JSDoc vous permet d'ajouter toutes les informations de type que vous souhaitez afin que les choses aient plus de sens lorsque vous revenez. Les (petites) fonctions correctement décomposées sont généralement assez faciles à gérer en raison de leur environnement bien défini (la fermeture). Les traces de pile incorrectes peuvent souvent être résolues avec une refactorisation pour vous assurer de ne pas diviser votre logique avec un rappel asynchrone entre les deux. Garder vos rappels asynchrones dans la même fermeture, il est facile de raisonner et de maintenir.
Rich Remer
2
J'ai passé 30 ans avec les langues compilées, mais après l'avoir utilisé pendant environ un an, JavaScript est maintenant ma langue de choix. C'est tellement productif - je peux faire beaucoup plus avec beaucoup moins de code que Java C # C ++ ou C. Mais c'est un état d'esprit différent. La variable non typée est en fait un avantage dans de nombreux cas. JSLINT est essentiel. Lorsque vous devez faire des choses simultanément, les rappels asynchrones sont beaucoup plus sûrs, plus faciles et finalement plus productifs que n'importe quelle langue dans laquelle vous devez utiliser des threads. Et vous devez de toute façon connaître JavaScript car c'est la langue du navigateur.
James
Je sympathise avec les préoccupations exprimées et je note que certains efforts ont été déployés pour y répondre, bien qu’elles ne soient certainement pas universellement appliquées. Il existe un projet étonnant appelé Tern qui peut fournir une dérivation de type à partir de l'analyse statique du code Javascript et des bibliothèques. Il a des plugins pour divers éditeurs. Il existe également Typescript, JSDoc et BetterJS . Et puis il y a Go , l'un des nombreux langages de compilation en Javascript !
joeytwiddle