Introduction
Si vous avez entendu parler de nœud ou lisez certains articles qui prétendent à quel point le nœud est grand, vous pourriez penser: «Qu'est-ce que le nœud exactement?» Bien que ce ne soit pas pour tout le monde, Node peut être le bon choix pour certaines personnes.
Pour essayer d'expliquer ce qu'est Node.js, cet article explore les problèmes qu'il peut résoudre, comment il fonctionne, comment exécuter une application simple, et enfin, lorsque le nœud est et quand n'est pas une bonne solution. Cet article ne couvre pas comment rédiger une application de nœud complexe, ni un tutoriel de nœud complet. La lecture de cet article devrait vous aider à décider si vous devez apprendre le nœud afin de l'utiliser pour votre entreprise.
Qu'est-ce que le nœud est conçu pour résoudre?
L'objectif publiquement revendiqué de Node est "de fournir un moyen simple de créer des programmes de réseau évolutifs". Quels sont les problèmes avec le programme de serveur actuel? Faisons un problème mathématique. Dans des langues comme Java ™ et PHP, chaque connexion génère un nouveau thread, qui peut nécessiter 2 Mo de mémoire complémentaire par nouveau thread. Sur un système avec 8 Go de RAM, le nombre maximal théorique de connexions simultanées est de 4 000 utilisateurs. À mesure que votre clientèle se développe, vous souhaitez que votre application Web prenne en charge plus d'utilisateurs, vous devez donc ajouter plus de serveurs. Bien sûr, cela augmente les coûts commerciaux, en particulier les frais de serveur, les frais d'expédition et les frais de main-d'œuvre. En plus de ces augmentations de coûts, il existe un problème technique: les utilisateurs peuvent utiliser différents serveurs pour chaque demande, de sorte que toute ressource partagée doit être partagée entre tous les serveurs. Par exemple, en Java, les variables statiques et les caches doivent être partagées entre JVMS sur chaque serveur. Il s'agit du goulot d'étranglement dans toute l'architecture des applications Web: le nombre maximum de connexions simultanées qu'un serveur peut gérer.
La solution de Node à ce problème consiste à modifier la façon dont la connexion se connecte au serveur. Chaque connexion crée un processus qui ne nécessite pas de bloc de mémoire complémentaire, au lieu de générer un nouveau thread OS pour chaque connexion (et d'allouant une mémoire compagnon à lui). Node affirme qu'il ne s'impose jamais car il ne permet pas du tout de verrous, et il ne bloquera pas les appels d'E / S directement. Node affirme également que le serveur exécutant peut prendre en charge des dizaines de milliers de connexions simultanées. En fait, le nœud modifie la face du serveur en modifiant les goulots d'étranglement à travers le système à partir du nombre maximal de connexions au trafic pour un seul système.
Maintenant que vous avez un programme qui peut gérer des dizaines de milliers de connexions simultanées, que pouvez-vous réellement construire avec le nœud? Si vous avez une application Web qui doit gérer autant de connexions, ce serait une chose "horrible"! C'est un "si vous avez ce problème, ce n'est pas du tout un problème". Avant de répondre à la question ci-dessus, examinons le fonctionnement du nœud et comment il est conçu pour fonctionner.
Le nœud n'est certainement pas
Oui, Node est un programme de serveur. Cependant, cela ne ressemble certainement pas à Apache ou Tomcat. Ces serveurs sont des produits de serveur autonome qui permettent d'installer et de déployer immédiatement les applications. Avec ces produits, vous pouvez faire fonctionner un serveur en une minute. Le nœud n'est certainement pas ce type de produit. Apache peut ajouter un module PHP pour permettre aux développeurs de créer des pages Web dynamiques, et les programmeurs utilisant TomCat peuvent déployer des JSP pour créer des pages Web dynamiques. Le nœud n'est certainement pas ce type.
Dans les premières étapes du nœud (actuellement version 0.4.6), il ne s'agissait pas d'un programme de serveur "Run-prêt", et vous ne pouvez pas l'installer, y placer des fichiers et avoir un serveur Web entièrement fonctionnel. Même si vous souhaitez implémenter la fonction de base du serveur Web en cours d'exécution une fois l'installation terminée, beaucoup de travail est toujours requis.
Comment fonctionne le nœud
Le nœud lui-même exécute V8 JavaScript. Attendez, JavaScript sur le serveur? C'est vrai, vous avez bien lu. JavaScript côté serveur est un concept relativement nouveau mentionné il y a deux ans lors de la discussion du produit Aptana Jaxer sur DeveloperWorks (voir ressources). Bien que Jaxer n'ait jamais été vraiment populaire, le concept lui-même n'est pas hors de portée - pourquoi ne pouvons-nous pas utiliser le langage de programmation utilisé sur le client sur le serveur?
Qu'est-ce qui fait V8? Le moteur JavaScript V8 est le moteur JavaScript sous-jacent que Google utilise pour leur navigateur Chrome. Peu de gens pensent de ce que fait réellement JavaScript sur le client? En fait, le moteur JavaScript est responsable de l'interprétation et de l'exécution du code. En utilisant V8, Google a créé un interprète super-rapide écrit en C ++ qui a une autre fonctionnalité unique; Vous pouvez télécharger le moteur et l'intégrer dans n'importe quelle application. Il ne se limite pas à fonctionner dans un seul navigateur. Ainsi, Node utilise en fait le moteur JavaScript V8 écrit par Google et le reconstruit pour une utilisation sur le serveur. Trop parfait! Maintenant qu'il existe une bonne solution disponible, pourquoi créer une nouvelle langue?
Programmation axée sur des événements
De nombreux programmeurs les ont éduqués à croire que la programmation orientée objet est la conception de programmation parfaite et dédaignent d'autres méthodes de programmation. Node utilise un modèle de programmation dite d'événements.
Listing 1. Programmation axée sur les événements à l'aide de jQuery sur le client
La copie de code est la suivante:
// Code jQuery sur le côté client montrant comment fonctionne la programmation axée sur l'événement
// Lorsqu'un bouton est enfoncé, un événement se produit - traitez-le
// directement ici dans une fonction anonyme, où tous les
// Les variables nécessaires sont présentes et peuvent être référencées directement
$ ("# mybutton"). Cliquez sur (fonction () {
if ($ ("# mytextfield"). val ()! = $ (this) .val ())
alert ("Field doit correspondre au texte du bouton");
});
En fait, il n'y a pas de différence entre le serveur et le client. Oui, il n'y a pas de fonctionnement de clic de bouton, ni une action pour saisir un champ de texte, mais à un niveau supérieur, l'événement se produit. Une connexion est établie - événement! Les données sont reçues via la connexion - événements! Les données s'arrêtent à travers la connexion - événement!
Pourquoi ce type de réglage est-il idéal pour le nœud? JavaScript est un excellent langage de programmation axé sur les événements car il permet des fonctions et des fermetures anonymes, et plus important encore, toute personne qui a un code écrit connaît sa syntaxe. La fonction de rappel appelée lorsqu'un événement se produit peut être écrit lors de l'événement de capture. De cette façon, le code est facile à écrire et à maintenir, sans des cadres orientés objet complexes, sans interfaces, et sans le potentiel de structurer quoi que ce soit. Écoutez simplement l'événement, écrivez une fonction de rappel, puis la programmation axée sur l'événement s'occupera de tout!
Exemple d'application de nœud
Enfin, regardons un code! Combinons tout ce que nous avons discuté et créons notre première application de nœud. Étant donné que nous savons déjà que le nœud est idéal pour gérer les applications à haut trafic, nous créerons une application Web très simple - une application conçue pour une vitesse maximale. Voici les exigences spécifiques pour notre exemple d'application expliquée par "Boss": Créez une API RESTful générateur de nombres aléatoires. Cette application doit accepter une entrée: un paramètre nommé "numéro". L'application renvoie ensuite un nombre aléatoire entre 0 et le paramètre et renvoie le numéro généré à l'appelant. Étant donné que "Boss" veut que ce soit une application très populaire, il devrait être en mesure de gérer 50 000 utilisateurs simultanés. Jetons un coup d'œil au code:
Listing 2. Node Nobe Number Generator
La copie de code est la suivante:
// Ces modules doivent être importés afin de les utiliser.
// Le nœud a plusieurs modules. Ils sont comme n'importe quel #include
// ou importer une déclaration dans d'autres langues
var http = require ("http");
var url = require ("url");
// La ligne la plus importante de n'importe quel fichier de nœud. Cette fonction
// fait le processus réel de création du serveur. Techniquement,
// Node indique au système d'exploitation sous-jacent que chaque fois qu'un
// La connexion est établie, cette fonction de rappel particulière doit être
// exécuté. Puisque nous créons un service Web avec API REST,
// Nous voulons un serveur HTTP, qui nécessite la variable HTTP
// Nous avons créé dans les lignes ci-dessus.
// Enfin, vous pouvez voir que la méthode de rappel reçoit une «demande»
// et l'objet «réponse» automatiquement. Cela devrait être familier
// à n'importe quel programmeur PHP ou Java.
http.createServer (fonction (demande, réponse) {
// La réponse doit gérer tous les en-têtes et les codes de retour
// ces types de choses sont gérés automatiquement dans les programmes de serveur
// Comme Apache et Tomcat, mais Node nécessite que tout soit fait vous-même
Response.WriteHead (200, {"Content-Type": "Text / Plain"});
// Voici un code unique. C'est ainsi que Node récupére
// Paramètres transmis des demandes du client. Le module URL
// gère toutes ces fonctions. La fonction d'analyse
// déconstruit l'URL et place les clés de la requête dans le
// Objet de requête. Nous pouvons trouver la valeur de la clé "numéro"
// en le faisant référence directement - la beauté de JavaScript.
var params = url.parse (request.url, true) .Query;
var input = params.number;
// Ce sont les méthodes JavaScript génériques qui créeront
// Notre numéro aléatoire qui est ramené à l'appelant
var numInput = nouveau numéro (entrée);
var numOutput = nouveau nombre (math.random () * numInput) .tofixed (0);
// Écrivez le nombre aléatoire à la réponse
Response.Write (numOutput);
// Le nœud nous oblige à mettre fin explicitement cette connexion. C'est parce que
// Node vous permet de garder une connexion ouverte et de transmettre des données dans les deux sens,
// Bien que ce sujet avancé ne soit pas discuté dans cet article.
réponse.end ();
// Lorsque nous créons le serveur, nous devons connecter explicitement le serveur HTTP à
// un port. Le port HTTP standard est de 80, nous le connecterons donc à celui-ci.
}). écouter (80);
// Sortie d'une chaîne à la console une fois que le serveur démarre, nous faisant tout savoir
// démarre correctement
console.log ("générateur de nombres aléatoires en cours d'exécution ...");
Mettez le code ci-dessus dans un fichier appelé "random.js". Maintenant, pour démarrer l'application et l'exécuter (puis créer un serveur HTTP et écouter les connexions sur le port 80), entrez simplement la commande suivante dans votre invite de commande:% nœud random.js. Voici à quoi il ressemble lorsque le serveur est déjà opérationnel:
La copie de code est la suivante:
root @ ubuntu: / home / moila / ws / mike # nœud random.js
Générateur de nombres aléatoires en cours d'exécution ...
Accéder à la demande
L'application est opérationnelle. Le nœud écoute n'importe quelle connexion, testons-le. Puisque nous avons créé une API RESTful simple, nous pouvons utiliser notre navigateur Web pour accéder à cette application. Tapez l'adresse suivante (assurez-vous de terminer les étapes ci-dessus): http: // localhost /? Number = 27.
Votre fenêtre de navigateur passera à un nombre aléatoire entre 0 et 27. Cliquez sur le bouton Recharger de votre navigateur et vous obtiendrez un autre numéro aléatoire. C'est tout, c'est votre première application de nœud!
À quoi sert le nœud?
Jusqu'à présent, vous devriez être en mesure de répondre à la question "Qu'est-ce que le nœud", mais vous ne serez peut-être pas clair quand vous devez l'utiliser. C'est une question importante à poser, car le nœud est bon pour certaines choses, mais à l'inverse, le nœud peut ne pas être une bonne solution pour d'autres pour le moment. Vous devez faire attention à décider quand utiliser le nœud, car l'utiliser dans la mauvaise situation peut entraîner un lot codé redondant.
Pourquoi est-ce bon?
Comme vous l'avez déjà vu, Node est parfait pour les situations où vous vous attendez à avoir un trafic élevé, et la logique et les exigences de traitement côté serveur ne sont pas nécessairement énormes avant de répondre au client. Des exemples typiques des performances exceptionnelles de Node comprennent:
1. API insuffisante
Un service Web qui fournit l'API RESTful reçoit plusieurs paramètres, les analyse, combine une réponse et renvoie une réponse (généralement moins de texte) à l'utilisateur. C'est la situation idéale pour le nœud, car vous pouvez le construire pour gérer des dizaines de milliers de connexions. Cela ne nécessite pas encore beaucoup de logique; Il recherche simplement certaines valeurs d'une base de données et combine une réponse. Étant donné que la réponse est une petite quantité de texte et une petite quantité de texte sur les demandes entrantes, le trafic n'est pas élevé et une machine peut gérer même les besoins de l'API des entreprises les plus occupées.
2.Twitter Fitre
Imaginez une entreprise comme Twitter, qui doit recevoir des tweets et les écrire dans une base de données. En fait, près de milliers de tweets sont atteints par seconde, et il est impossible pour la base de données de traiter le nombre d'écritures requises pendant les périodes de pointe en temps opportun. Le nœud est devenu une partie importante de la solution à ce problème. Comme vous pouvez le voir, le nœud peut gérer des dizaines de milliers de tweets entrants. Il les écrit rapidement et facilement dans un mécanisme de file d'attente de mémoire (par exemple Memcached) où un autre processus distinct peut les écrire dans la base de données. Le rôle de Node ici est de collecter rapidement des tweets et de transmettre ces informations à un autre processus responsable de l'écriture. Imaginez une autre conception - un serveur PHP ordinaire tente de gérer l'écriture dans la base de données elle-même - chaque tweet entraînera un bref délai lors de l'écriture dans la base de données, car l'appel de la base de données bloque le canal. En raison de la latence de la base de données, une machine conçue comme celle-ci ne peut gérer que 2000 tweets entrants par seconde. 1 million de tweets par seconde nécessitent 500 serveurs. Au lieu de cela, Node gère chaque connexion sans bloquer le canal, capturant ainsi autant de tweets que possible. Une machine de nœud qui peut gérer 50 000 tweets ne nécessite que 20 serveurs.
3. Serveur de fichiers image
Une entreprise avec de grands sites Web distribués, tels que Facebook ou Flickr, peut décider d'utiliser toutes les machines uniquement pour les images de service. Le nœud serait une bonne solution à ce problème, car la société peut l'utiliser pour écrire un simple récupération de fichiers, puis traiter des dizaines de milliers de connexions. Le nœud recherchera le fichier image, renvoie le fichier ou une erreur 404, puis ne fera rien. Cette configuration permettra à ces sites Web distribués de réduire le nombre de serveurs dont ils ont besoin pour desservir des fichiers statiques tels que des images, des fichiers .js et .css.
Pourquoi est-ce mauvais?
Bien sûr, dans certains cas, le nœud n'est pas idéal. Voici les domaines dans lesquels le nœud n'est pas bon:
1. Pages créées dynamiquement
Actuellement, Node ne fournit pas de méthode par défaut pour créer des pages dynamiques. Par exemple, lorsque vous utilisez la technologie Javaserver Pages (JSP), vous pouvez créer une page index.jsp qui contient une boucle dans un tel extrait de code JSP. Le nœud ne prend pas en charge de telles pages dynamiques, motivées par HTML. De même, Node n'est pas très adapté en tant que serveur Web comme Apache et Tomcat. Par conséquent, si vous souhaitez fournir une telle solution côté serveur dans Node, vous devez écrire vous-même la solution entière. Les programmeurs PHP ne veulent pas écrire un convertisseur PHP pour Apache chaque fois qu'ils déploient une application Web, et jusqu'à présent, c'est exactement ce que Node vous demande de faire.
2. Applications lourdes de la base de données relationnelle
Le but du nœud est rapide, asynchrone et non bloquant. Les bases de données ne partagent pas nécessairement ces objectifs. Ils sont synchrones et blocs, car les appels vers la base de données pendant la lecture et l'écriture bloqueront le canal jusqu'à ce que le résultat soit généré. Par conséquent, une application Web qui nécessite de nombreux appels de base de données, beaucoup de lectures, beaucoup d'écrits par demande sont très inadaptés à Node, car la base de données relationnelle elle-même peut compenser les nombreux avantages du nœud. (La nouvelle base de données NoSQL est plus adaptée au nœud, mais c'est un autre sujet.)
Conclusion
La question est "Qu'est-ce que Node.js?" aurait dû répondre. Après avoir lu cet article, vous devriez être en mesure de répondre à cette question dans quelques phrases claires et concises. Si c'est le cas, vous êtes à l'avant-garde de nombreux codeurs et programmeurs. J'ai parlé de Node avec beaucoup de gens, mais ils ont été confus de ce qu'est exactement le nœud. Naturellement, ils ont l'état d'esprit d'Apache - un serveur est une application qui y met des fichiers HTML et tout fonctionnera correctement. Et le nœud est motivé par le but. Il s'agit d'un logiciel qui utilise JavaScript pour permettre aux programmeurs de créer facilement et rapidement des serveurs Web rapides et évolutifs. Apache est prêt à fonctionner, tandis que le nœud encodait prêt à fonctionner.
Node atteint son objectif de fournir un serveur hautement évolutif. Au lieu d'allorer un modèle "un thread par connexion", il utilise un modèle "un processus par connexion" pour créer uniquement la mémoire requise pour chaque connexion. Il utilise un moteur JavaScript très rapide de Google: le moteur V8. Il utilise une conception axée sur les événements pour garder le code minimal et facile à lire. Tous ces facteurs contribuent à l'objectif idéal du nœud - il est plus facile d'écrire une solution hautement évolutive.
Aussi important que de comprendre ce qu'est le nœud, comprendre ce qu'il n'est pas. Le nœud ne remplace pas Apache, qui est conçu pour rendre les applications Web PHP plus évolutives. C'est en effet le cas. À ce stade initial du nœud, il est peu probable qu'un grand nombre de programmeurs l'utilisent, mais dans les scénarios où il fonctionne, il fonctionne très bien.
Que dois-je attendre de Node à l'avenir? C'est peut-être la question la plus importante que cet article soulève. Maintenant que vous savez ce qu'il fait maintenant, vous devriez vous demander ce qu'il fera ensuite. Au cours de la prochaine année, j'attends avec impatience Node offrir une meilleure intégration avec les bibliothèques de support tierces existantes. De nombreux programmeurs tiers ont désormais développé des plug-ins pour Node, notamment en ajoutant de la prise en charge du serveur de fichiers et de la prise en charge MySQL. Espérons que Node commencera à les intégrer dans sa fonctionnalité principale. Enfin, je veux également que Node prenne en charge une sorte de module de page dynamique afin que vous puissiez faire ce que vous faites en PHP et JSP (peut-être un NSP, une page de serveur de nœuds) dans le fichier HTML. Enfin, j'espère qu'un jour, un serveur de nœuds "prêt pour le déploiement" apparaîtra, qui peut être téléchargé et installé, il suffit de mettre vos fichiers HTML, tout comme à utiliser Apache ou Tomcat. Le nœud est toujours dans ses premiers stades, mais il se développe très rapidement et pourrait bientôt être dans votre vision.